Возвращено слишком много данных - MySQL - PullRequest
2 голосов
/ 29 мая 2010

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

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

Заказы: order_id, cust_id, order_comments

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

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

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 29 мая 2010

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

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

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

0 голосов
/ 29 мая 2010

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

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

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

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

0 голосов
/ 29 мая 2010

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

// 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'

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

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

0 голосов
/ 29 мая 2010

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

Jack black
   comments
   comments
   comments
   comments

Simon Smith
   comments
   comments
   comments
...