0

無向グラフを表す MySQL のテーブルがいくつかあります。Usersテーブルには a (および今user_idは必要のないその他のもの) があり、Linksテーブルにはuser_id_1and 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_1user_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 を直接含むリンクを返す必要があります。

4

0 に答える 0