我有2张桌子
People
id|name|age
Loves
id1|id2 //id1 loves id2
我需要一个SQL查询,让我知道那些被年龄较低的人所喜爱的人的身份。
直到现在我写了类似的东西:
select name from People where ID in (select ID1 from (select * from People, Likes where People.ID = Loves.ID2)) <
(select age from People, Loves where People.ID = Loves.ID2);
这是错误的。
答案 0 :(得分:2)
如果爱情关系是互惠的 - amor ch'a nullo amato amar perdona - 那么你可以使用马丁·史密斯的答案。
如果关系是方向性的,并且P1可能喜欢P2而不被反馈,那么这就变成了
SELECT loved.id, COUNT(*) AS lovers
FROM People AS lover
JOIN Loves AS loves ON (lover.id = loves.id1)
JOIN People AS loved ON (loves.id2 = loved.id)
WHERE lover.age < loved.age
GROUP BY loved.id;
我们开始选择爱别人的人:
SELECT ... FROM People AS lover
然后我们添加他们所属的关系:
... JOIN loves ON (lover.id = loves.id1)
由于我们需要所爱的人的年龄,我们需要再次与人们一起加入:
... JOIN People AS loved ON (loves.id2 = loved.id)
以上是所有非孤独的人。我们需要限制那些年龄比自己年轻的人,
WHERE lover.age < loved.age
(我们可以忽视伍迪艾伦的智慧并添加AND loves.id1 != loves.id2
)
但是现在我们发现不止一个人所爱的人会在输出中多次出现。没有办法避免这种情况,因为他们
所以我们要做的就是使用DISTINCT来抑制重复的行(这是Martin Smith的想法)或尝试通过使用附加信息来利用这种情况 - we can count the lines通过对所爱的&#39进行分组; s id:
SELECT loved.id, COUNT(*) AS lovers...
答案 1 :(得分:1)
这是另一种方式(不像@MartinSmith那样干净):
select id2
from
(select id1
,p.age as lover_age
,id2
,p2.age as loved_age
from loves
left join people p on p.id = loves.id1
left join people p2 on p2.id = loves.id2) t
where t.lover_age < t.loved_age
Here是您可以使用的示例