2016-10-25 9 views
0

私は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の最初のクエリではアルバムは選択されません。フィルタリングのためにそのアルバムが選択されていると思いますが、解決できません。

+0

理由あなたが最初のクエリで「album1」を取得されていませんが、この条件によるものである 'share.permissionがnullまたはshare.permissionです!=「OWNER''。 album_id = 8の権限は 'OWNER'に設定されているので、SQLの条件は常にFALSEになります。 – Maruli

答えて

1

関連album_share.permissionは、それが条件permission IS NULL OR permission != 'OWNER'を満たさないとして除外され、OWNERあるため、最初のクエリはalbum1と行を返しません。

+0

ええ、しかし、私はuser_id = 22で2番目のクエリの条件が必要です – IvyBrain

+1

最初に一般的な英語(またはあなたの選択の他の言語)でそれをSQLに変換する必要がある行を定義してみてください。しばしば、あなたはそれをはっきりと記述すると、問題はなくなります。 –

0

album1 は、条件が、その場合には真であることを行ったことがない「share.permissionがnullである」album_shareテーブルとの関係を持っています。

変更は、それ

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 or share.permission != 'OWNER'); 
0

以下のようにそれはあなたがそれを望んでいないと言うので、ここを見ていないです!

share.permission = '所有者'

これは、共有パーミッションが '所有者'ではない場合と同じです。もしあなたがopositeを '='でなく '!='と言うだけならば、 。

- ユーザーID = 23を使用する場合 - album1、album2 - !!失敗:album1は結果にありません!!

SELECT * fromLEFT JOIN album_share share ON share.album_id = a.idここで(a.user_id = 23またはshare.user_id = 23)および(share.permissionはnullまたはshare.permission!= 'オーナー');

0

以下のクエリを実行すると、2つのレコードが得られます。

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

Output

そして、あなたはwhere句で第二の条件を追加するとき、それはあなたが本当にそれがOWNERと等しくない権限だかどうかを確認したい場合は知らない1 record.Iをフィルタリングします。あなたは両方のレコードをしたいなら、あなたは2番目のクエリを変更する必要がありますし、あなたのクエリは次のようなものになります。

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

出力:

Output

あなたのクエリ:

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

出力:

Output-3

関連する問題