Возвращает набор строк «один ко многим» в mysql без дублирования

#mysql #pdo

#mysql #pdo

Вопрос:

У меня есть база данных users и user items , в которой каждый пользователь может иметь несколько элементов, связанных со своей учетной записью.

Проблема, с которой я сталкиваюсь с моим текущим SELECT запросом, заключается в том, что я хочу вернуть каждого пользователя один раз, но со всеми строками, привязанными к этому пользователю, примерно так:

 User 1 ¬
      item id 1
      item id 2
      item id 3
User 2 ¬
      item id 1
      item id 3
      etc
  

Это было бы моим идеальным результатом выборки, чтобы я мог правильно обрабатывать данные простым циклом… итак, я попробовал left join , но это не сработало.

Мне интересно, как мне получить результаты, подобные приведенным выше? Это мой текущий запрос:

 SELECT U.user_id, I.item_name  
FROM users U
LEFT JOIN user_items UI ON U.user_id = UI.user_id
INNER JOIN items I ON I.item_id = UI.item_id
  

В настоящее время, если у пользователя есть два или более элемента, я получаю дублированные данные для идентификатора пользователя, чего я пытаюсь избежать.

Ответ №1:

Если я правильно понимаю проблему, вы пытаетесь обойти взаимосвязь master / detail .

Всякий раз, когда вы используете объединения, движок будет выводить каждый соответствующий набор строк. В этом случае, если у пользователя более 1 элемента, он будет отображаться вместе с каждым из них. Этого нельзя избежать, поскольку вы не можете получить результирующий набор с различным количеством столбцов или что-то вроде «не выводить этот столбец, если предыдущий имеет то же значение». Я бы не пытался решить это, корректируя запрос. ЛЕВОЕ СОЕДИНЕНИЕ поможет вам, только если вы хотите, чтобы также был каждый пользователь, у которого нет никаких элементов.

Чтобы получить желаемый результат, вам нужно поработать с результирующим набором. Например, вы могли бы упорядочить результаты по user_id, затем просмотреть набор и печатать user_id только при его изменении. Другим вариантом было бы использовать 2 запроса: один для получения каждого пользователя (вы можете сузить его до каждого, у которого есть хотя бы один элемент, если хотите), а другой для получения элементов для каждого пользователя, просматривая результаты первого запроса.

Оба решения требуют, чтобы вы обрабатывали результаты с помощью хранимой процедуры или языка программирования.

Надеюсь, это поможет!

Комментарии:

1. Хм, я удивлен, что MYSQL имеет такое ограничение =/