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,因此无效。
如何实现这一目标?
答案 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 JOIN
与WHERE
子句一起使用。
JOIN查找个人资料已投票的人(不包括自我投票),WHERE选择相反的情况(LEFT JOIN
带来空值)。
请注意,我从输出中删除了targetid
列,因为我认为它没有意义(我们正在寻找投票不存在的对)。