6

前提条件

私は2つのテーブルを持っています。1 つのテーブル内の人のリストと、外部キー ルックアップ テーブル内での互いの優先度。最初の表は人のリストだけです。もう1つは、ルームメイトとして持ちたいと思う他の人を数人リストアップする場所です.

テーブルの人々:

  • ID、名前、姓などを持つ人のリスト

テーブルの選択肢:

  • 選択者のリスト (FK People ID)
  • 選択されたもののリスト (FK People ID)

質問

SQL (または PHP) との一致を一覧表示するにはどうすればよいですか? つまり、ルームメイトにしたい人のリストにも1人いるのはどこですか?基本的に、選択されたもののリストを持つセレクターがあります。選択者が選択したリストにも含まれているかどうかを確認するにはどうすればよいでしょうか?

基本的に、私はすべての安定した一致に関するレポートが必要です。つまり、選択者は、選択したものの少なくとも 1 つのリストにも含まれています。

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))

最後GROUP BYに、スワップされた列の重複する一致を削除します。SQLフィドルの動作

于 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 を取得する必要があります...ただし、double を取得します (両方の参照が返されます)。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 に答える