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

mik*_*ike 1 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)
Run Code Online (Sandbox Code Playgroud)

它目前返回:

Joe,Smith,60657,male
Joe,Smith,60657,male
Mickey,Mouse,60613,female
Petter,Pan,60625,male
Petter,Pan,60625,male
Donald,Duck,60615,male
Run Code Online (Sandbox Code Playgroud)

如果用户属于这两个类别,则它当前将返回两次.如何在不使用SELECT DISTINCT的情况下仅返回用户一次,无论他们属于多少个类别?

Mar*_*ith 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))
Run Code Online (Sandbox Code Playgroud)

在MySQL中,子查询的性能很成问题,但是JOIN通过DISTINCT或者GROUP BY可以执行更好的重复消除.