我正在尝试运行以下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的情况下仅返回用户一次,无论他们属于多少个类别?
答案 0 :(得分:6)
你需要一个半连接。这可以通过子查询来实现。
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
和重复淘汰可能会有更好的效果。
答案 1 :(得分:3)
我不知道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
运行得最快,但我已经了解了我的期望,而且数据库性能往往差异很大!
答案 2 :(得分:0)
尝试使用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