私はSQL上で脳を壊しています。誰かが私にヒントを与えるかもしれません。2つのテーブルを結合したSQLクエリ
例のセットアップ:
CREATE TABLE album
(
name text NOT NULL,
id serial NOT NULL,
user_id bigint NOT NULL
);
CREATE TABLE album_share
(
id integer NOT NULL,
user_id bigint NOT NULL,
album_id bigint NOT NULL,
permission character varying(20)
);
INSERT INTO album_share VALUES (21, 23, 8, 'OWNER');
--INSERT INTO album_share VALUES (22, 22, 8, 'READ');
INSERT INTO album VALUES ('album1', 8, 23);
INSERT INTO album VALUES ('album2', 12, 23);
INSERT INTO album VALUES ('album3', 13, 22);
INSERT INTO album VALUES ('album4', 15, 22);
--Expecting with user_id=23
-- album1,album2
--!! Failed: album1 is not in the result !!
SELECT * from album a
LEFT JOIN album_share share ON share.album_id = a.id
where (a.user_id = 23 or share.user_id = 23)
and (share.permission is null or share.permission != 'OWNER');
--Expecting with user_id=22
-- album3,album4
-- Works fine
SELECT * from album a
LEFT JOIN album_share share ON share.album_id = a.id
where (a.user_id = 22 or share.user_id = 22)
and (share.permission is null or share.permission != 'OWNER');
の例では、オンラインでも入手可能です:
私は自分のデータで参加し、filterd二つの表から選択しようとしています。それはフィドルでよりよく説明されます。 user_id = 23の最初のクエリではアルバムは選択されません。フィルタリングのためにそのアルバムが選択されていると思いますが、解決できません。
理由あなたが最初のクエリで「album1」を取得されていませんが、この条件によるものである 'share.permissionがnullまたはshare.permissionです!=「OWNER''。 album_id = 8の権限は 'OWNER'に設定されているので、SQLの条件は常にFALSEになります。 – Maruli