SQL-запрос не возвращает уникальные результаты.Какой тип соединения мне нужно использовать? - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь выполнить следующий запрос MySQL:

SELECT * 
FROM user u 
JOIN user_categories uc ON u.user_id = uc.user_id 
WHERE (uc.category_id = 3 OR uc.category_id = 1)

В настоящее время он возвращает:

Joe,Smith,60657,male
Joe,Smith,60657,male
Mickey,Mouse,60613,female
Petter,Pan,60625,male
Petter,Pan,60625,male
Donald,Duck,60615,male

Если пользователь принадлежит к обеим категориям, он в настоящее время возвращает их дважды.Как я могу вернуть пользователя только один раз, не используя SELECT DISTINCT, независимо от того, к каким категориям он принадлежит?

Ответы [ 3 ]

6 голосов
/ 25 апреля 2011

Вам нужно полу соединение. Это может быть достигнуто с помощью подзапроса.

SELECT * 
FROM user u 
WHERE EXISTS(SELECT * 
       FROM user_categories uc 
       WHERE u.user_id = uc.user_id AND  
       uc.category_id IN(1,3))

В MySQL выполнение подзапросов довольно проблематично, поэтому JOIN и удаление дубликатов с помощью DISTINCT или GROUP BY могут работать лучше.

3 голосов
/ 25 апреля 2011

Я не знаю о MySQL, но в Postgres вы можете получить лучшую производительность в версии с полусоединением от

SELECT * FROM user u 
WHERE u.user_id 
IN (SELECT user_id FROM user_categories uc WHERE uc.category_id IN (1,3));

Я ожидаю, что SELECT DISTINCT будет работать быстреено я узнал, что мои ожидания и производительность БД часто сильно отличаются!

0 голосов
/ 25 апреля 2011

Попробуйте использовать GROUP BY

SELECT * FROM user u
JOIN user_categories uc ON u.user_id = uc.user_id
WHERE uc.category_id = 3 OR uc.category_id = 1
GROUP BY u.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...