6

先决条件

我有两张桌子。一张表中的人员列表,以及他们在外键查找表中的偏好。第一个表只是人员列表。另一个是他们都列出了他们希望作为室友的其他一些人。

餐桌人:

  • 身份证、姓名、姓氏等人员名单

餐桌选择:

  • 选择者列表(FK 人员 ID)
  • 选择的列表(FK 人 ID)

问题

如何使用 SQL(或 PHP)列出匹配项?也就是说,在他想成为室友的人的名单上还有一个人?基本上,您有一个带有所选列表的选择器。您将如何检查选择者是否也在他或她选择的列表中?

基本上我想要一份关于每场稳定比赛的报告,即选择者也在他或她选择的至少一个列表中。

我猜一个 for 循环可以解决问题,但是您如何将第一次迭代放在一起呢?循环的其余部分要少得多?

4

3 回答 3

5

基于加入的解决方案:

SELECT
    r1.name as name1,
    r2.name as name2
FROM
    roommate r1
JOIN
    roommate_pair rp1 ON r1.id = rp1.chooser_id
JOIN
    roommate r2 ON r2.id = rp1.choosen_id
JOIN
    roommate_pair rp2 ON r2.id = rp2.chooser_id
WHERE
    rp2.choosen_id = r1.id
GROUP BY
    CONCAT(GREATEST(r1.id,r2.id),'-',LEAST(r1.id,r2.id))

Last GROUP BY is to remove duplicate matches in swapped columns. Working SQL Fiddle

于 2013-01-19T22:12:42.717 回答
2
SELECT a.chooser, a.chosen
FROM roommates a,roommates b
WHERE a.chooser = b.chosen
AND a.chosen = b.chooser;

使用上面的查询,你应该得到交叉引用的 id ......但是,你确实得到了双精度(两个引用都返回)。请参阅SQL 小提琴。您可以在您的 PHP 代码中进行检查。

于 2013-01-19T22:11:07.017 回答
1

这段代码应该为您提供一些提示。首先,您将遍历所有人。然后从可能的首选人员列表中,您只选择那些反过来在他们的首选人员列表中拥有原始人员的人。

for cc in (select * from people) loop
  for dd in (select * from preferences pr where pr.source_id = cc.people_id and exists (select 1 from preferences pr1 where pr1.source_id = pr.friend_id and pr1.friend_id = cc.people_id)) loop
    --do your stuff here
  end loop
end loop
于 2013-01-19T21:27:41.400 回答