"Один ко многим" слишком много данных возвращаются к серверу MySQL


У меня есть 2 связанные таблицы MySQL в отношении один ко многим.

Клиенты: cust_id, cust_name, cust_notes

Orders: order_id, cust_id, order_comments

Итак, если я делаю стандартное соединение, чтобы получить всех клиентов и их заказы через PHP, я возвращаю что-то вроде:

  • Джек Блэк, заметки Джека, комментарии к 1-му порядку Джека
  • Джек Блэк, заметки Джека, комментарии о 2-м порядке Джека
  • Саймон Смит, заметки Саймона, комментарии по поводу 1-го порядка Симона
  • Саймон Смит, заметки Саймона, комментарии о 2-м порядке Саймона

Проблема в том, что cust_notes является текстовым полем и может быть довольно большим (несколько тысяч слов). Таким образом, кажется, что возврат этого поля для каждого заказа является недостаточным.

Я мог бы использовать GROUP_CONCAT и JOINS, чтобы вернуть все order_comments в одной строке, но order_comments-это тоже большое текстовое поле, поэтому кажется, что это может создать проблему.

Должен ли я просто использовать два отдельных запроса, один для таблицы customers и один для таблицы orders?

Есть ли лучший способ?

4 2

4 ответа:

Смотрите. Ваша страница очень похожа на страницу вопросов на SO. Сначала вопрос и ответы ниже.
Никто не потрудился запросить его одним запросом!

Ответы-да, использует join, но только для получения имен и идентификаторов, а не полной информации пользователя.
Ничего сложного.

Просто используйте отдельные запросы для клиента и для списка заказов

Если я правильно понял ваш вопрос, то лучше использовать два запроса, например:

Jack black
   comments
   comments
   comments
   comments

Simon Smith
   comments
   comments
   comments

Обычно мы использовали несколько различных стратегий.

В одном случае мы вернули несколько наборов результатов - один набор для родителей и один для всех детей. Порядок ПО был таким же, так что вы могли легко чередовать дочерние элементы для каждого родителя в клиентском коде.

Также можно было возвращать несколько результирующих наборов-один для родителей и один набор детей для каждого родителя (мы использовали курсор для внешней части этого).

Еще одна вещь, которую мы использовали (в SQL Server) был XML, так что он фактически вернул иерархическую форму.

Вы можете выполнить два запроса, один для заметок и один для сведений о клиенте.

// this will give you orders in an efficient way
SELECT cust_id, order_id, order_comments
FROM customers AS c
LEFT JOIN orders as o ON o.cust_id = c.cust_id
LIMIT xx, yy

// this will get all details from N specific customers
SELECT * FROM customers
WHERE cust_id = 'xxx' OR cust_id = 'yyy' OR cust_id = 'zzz'

, а затем передайте второй запрос в массив и, как вы показываете первый, используйте сведения от клиента, которые хранятся в массиве.

Должно быть довольно эффективно.