简单的SQL语句,找到年轻的情人

时间:2017-10-27 20:10:07

标签: sql

我有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);

这是错误的。

2 个答案:

答案 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

但是现在我们发现不止一个人所爱的人会在输出中多次出现。没有办法避免这种情况,因为他们在Loves表中不止一次。

所以我们要做的就是使用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是您可以使用的示例