無向グラフを表す MySQL のテーブルがいくつかあります。Users
テーブルには a (および今user_id
は必要のないその他のもの) があり、Links
テーブルにはuser_id_1
and user_id_2
(および乗車のために必要なその他のデータ) があります。特定のユーザーの隣人 (自分自身を含む) 間のすべてのリンクを取得しようとしています。私の質問は、基本的には次のとおりです。これを行うにはどうすればよいですか? 次のやや残念なクエリを使用して、ユーザーのすべての隣人と自分自身を取得することができました。
SELECT u.* FROM Users u
JOIN Links l ON u.user_id = l.user_id_1
WHERE l.user_id_2 = @arg
UNION
SELECT u.* FROM Users u
JOIN Links l ON u.user_id = l.user_id_2
WHERE l.user_id_1 = @arg
UNION
SELECT * FROM Users
WHERE user_id = @arg
ここで、上記のクエリにとのLinks
両方が表示されるものを正確に選択したいと思います。そのクエリを2回実行せずにこれを行う方法はありますか? (私はそれをプロファイリングしていませんが) 上記のクエリがかなり非効率的であるというこっそりとした疑いを持っているからです。二次的な質問として、サブクエリを実行するためのより良い方法はありますか?user_id_1
user_id_2
編集:サンプルデータと出力を求められたので、ここに行きます。ここに表をあげLinks
ます。これらのユーザーはすべて実際にテーブルに存在することを約束するUsers
ので、結合の失敗などについて心配する必要はありません。ただし、この質問は、まったく参加しなくても答えられるはずだと思いますUsers
。
link_id user_id_1 user_id_2
1 A B
2 C B
3 C A
4 D C
5 C E
6 D E
7 A D
8 F A
次に、A に対してこのクエリを実行すると、Users
上記のクエリは、A の隣人ではない E を除くすべての人を返す必要があります (他のすべてはそうです)。私が探しているクエリはLinks
、E を含む 5 と 6 を除いて、テーブル内のすべてを返す必要があります。特に、2 と 4、および A を直接含むリンクを返す必要があります。