#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 имеет такое ограничение =/