MYSQL查询从关系表中检索数据并过滤掉重复项

时间:2016-10-25 09:18:49

标签: php mysql

所以我目前得到了这个问题:

SELECT user_expertise.user_id, user_expertise.expertise_id
FROM user_expertise
INNER JOIN user_locations ON user_expertise.user_id = user_locations.user_id
WHERE user_expertise.expertise_id!=$exid AND user_locations.location_id = $_SESSION["user"]["location"]["location_id"]
ORDER BY user_expertise.user_id

$exid是专业知识的当前ID,$_SESSION["user"]["location"]["location_id"]是从会话中检索的当前位置ID。为了这个例子,我们说$exid = 3981$_SESSION["user"]["location"]["location_id"] = 24

我只想检索没有附加expertise_id $exid (3981)的用户。当前的问题是,附加了这个id的用户在他们还有另一个附加到他们的用户时会显示。假设user_id 22的用户有39816523。在这种情况下,我不希望他成为结果的一部分,但他是。起初他没有被选中,因为他3981附加了他,但后来他被选中,因为他也有6523

更新:所以我对用于执行查询的代码感到有点生气,并在一个新代码中重新编写其中一个代码,这样我就可以传入一个完整的查询字符串。现在我可以尝试你所有的想法而不会头疼。

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT p.user_id, p.expertise_id FROM (
    SELECT s.user_id, s.expertise_id,t.expertise_id,
           CASE WHEN s.expertise_id = t.expertise_id THEN 1 ELSE 0 as ind
    FROM user_expertise s
    INNER JOIN user_locations ss ON s.user_id = ss.user_id
    CROSS JOIN user_expertise t
    WHERE t.user_id = $exid 
      AND s.user_id <> t.user_id
      AND ss.location_id = $_SESSION["user"]["location"]["location_id"]) p
GROUP BY p.user_id, p.expertise_id
HAVING MAX(p.ind) = 0

答案 1 :(得分:0)

您可以直接对表应用条件,无需在连接结果上添加条件。它也更具可读性。

SELECT user_expertise.user_id, user_expertise.expertise_id
FROM user_expertise
WHERE 1=1
AND user_expertise.user_id NOT IN 
  (SELECT user_id FROM user_expertise WHERE expertise_id=$exid)
AND user_expertise.user_id IN
  (SELECT user_id from user_locations where location_id = $_SESSION["user"]["location"]["location_id"])
ORDER BY user_expertise.user_id