おそらく悪いタイトルです。 これは状況です:Postgresでマスタとスレーブの両方を取得するクエリ
ユーザーテーブル:
id
name
接続テーブル:上記のインサートを
id
master_id
slave_id
insert into Users values(1,'Jack');
insert into Users values(2,'Marc');
insert into Users values(3,'Susie');
insert into Users values(4,'Paul');
insert into Connections values(1,1,2);
insert into Connections values(2,3,1);
insert into Connections values(3,3,4);
、ジャックはスレーブとしてマークされています。 しかし彼はスージーの奴隷です。 Paulはスージーの奴隷です。
今、私はジャックの奴隷であるすべての人々をフェッチする必要があります。しかし、私はまた、ジャックのマスターとそのマスターの奴隷を取り出す必要があります。
英語では、ジャックのためにすべてのユーザーがテーブルに入ることを意味します。マークはジャックの奴隷だから。スージーはジャックのマスターです。 ポールはスージーの奴隷です(そして、スージーはジャックの主人だったので、ポールは何らかの形で私の所属するユーザーのリストに何らかの形で入っています)。
これはかなり明確です。
これをすべて1つのクエリで取得できますか? 今すぐ、ジャックのすべてのスレーブを取得するクエリがあります。私はジャックのすべてのマスターを得るためのものを作りました。しかし、私はすべての奴隷を得るために各マスターをループする必要があります。少なくとも3つのクエリが生成されます。 私はnode.jsをすべてのコールバックのものと併用しているので、実際には良い選択肢ではありません。 私はUNIONについて考えていましたが、私はそれが行く方法であると確信していません。また、ストアドプロシージャ、私はそれらを避けることをお勧めします。
実際に、UNIONを使用すると、Imスレーブの行とImマスタのある行の両方を選択できます。しかし、私はまだマスターがmaster_idである行をフェッチする方法を知りません。
--- EDIT ---
は、私は今、このクエリを実行しています:
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."master_id" = 1
union
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."slave_id" = 1
union
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."master_id" IN
(select "connections"."master_id" from "connections" where "connections"."slave_id" = 1)
それは私に期待される結果を与えているようです。 この場合、テーブル接続のすべての行になります。 あなたはそれが正しいようですか?
あなたがそのサンプルデータから期待する出力は何ですか? –
私は解決策になるかもしれないと思うことを追加しても、質問を編集しました。 – oderfla