SQL查询不返回唯一结果。我需要使用哪种类型的联接?

时间:2011-04-25 00:29:29

标签: mysql sql

我正在尝试运行以下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 个答案:

答案 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中,子查询的性能存在很大问题,因此通过JOINDISTINCT进行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