获取用户未对SQL查询投票的所有配置文件

时间:2015-07-18 08:46:24

标签: mysql sql

profiles:
+--------+
id
name
surname

voted:
+--------+
id
profileid
targetid

我有一个包含用户个人资料的表格和另一个表格,我可以跟踪谁投票给谁。 (profileid是投票人的个人资料ID,targetid是投票人的个人资料ID

我想:

获取当前用户(例如ID为1)投票的人的所有个人资料(也不包括他自己)。

我试过了:

SELECT profiles.name,profiles.surname,voted.targetid 
FROM profiles 
JOIN voted 
ON profiles.id = voted.profileid
WHERE profiles.id != 1 # exclude self

在此处查看实时fiddle,但由于我不确定如何形成JOIN,因此无效。

如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

我会这样做:

SELECT p.name
    ,p.surname
FROM profiles AS p
WHERE p.id NOT IN (
    SELECT targetId
    FROM voted
    WHERE profileId = 1
    )
    AND p.id <> 1

我假设profileId和targetId都是外键并连接到profiles.id

这个查询的作用是首先从所投票的表中选择所有targetId,其中profileId是我选择的(在我们的例子中是1),这意味着我们正在选择我的用户投票的人的ID(因为表格中注明了表决权

然后我想选择所有不在此列表中的人。 TADAH,我有所有未经我选择的用户投票的人。

没有加入

编辑:我忘了检查查询中没有选择用户,通过添加p.id&lt;&gt;来解决1(表示p.id与1不同)

答案 1 :(得分:1)

这是一种方法:

SELECT 
  profiles.name,
  profiles.surname
FROM profiles 
LEFT JOIN voted 
  ON profiles.id = voted.targetid
  AND voted.profileid = 1 /* <- your param here */
  AND voted.profileid != voted.targetid 
    /* has not voted for him/herself */
WHERE voted.profileid is null

以下是结果:http://sqlfiddle.com/#!9/80a6b/14

它的工作原因是LEFT JOINWHERE子句一起使用。

JOIN查找个人资料已投票的人(不包括自我投票),WHERE选择相反的情况(LEFT JOIN带来空值)。

请注意,我从输出中删除了targetid列,因为我认为它没有意义(我们正在寻找投票存在的对)。