2012-01-23 6 views
2

ご要望にお応えしてください。2つのテーブルのデータをフィルタリングしてください

artistalbumの2つのテーブルがあります。 アルバムに画像が含まれているアーティストのみを選択したいと考えています。俳優が10枚のアルバムを持っており、唯一のそれらの絵を持っているか含まれていない場合、私は(すべてのアルバムのアーティストが写真を持っている場合のみ)スキップしたいされ

テーブルアーティスト:

artist_id 
---------| 
1  | 
2  | 

テーブルアルバム:

artist_id | album_id | picture_id 
--------------------------------- 
1   | 122... | true 
1   | 123... | false 
2   | 124... | true 
2   | 125... | true 

だから、(すべてのアルバムが写真を持っているので)、私はartist_id=2のみ、アーティストを選択します。

答えて

6

ソリューションの多くは、私の心に来る最初は非常に単純なサブ画像選択せずにアルバムを持っているアーティストを除外することで、このためにあります。

SELECT 
    * 
FROM 
    artist a 
WHERE 
    artist_id NOT IN 
    (SELECT DISTINCT artist_id FROM album WHERE picture_id = false); 

EDIT:
アルバムなしのアーティストを保存している場合は、除外する必要があります(説明のコメントをご覧ください)。その場合には、あなたのような何かを追加する必要があります:

AND 
    1 <= (SELECT COUNT(*) FROM album WHERE artist_id = a.artist_id) 
+1

これは、アルバムが全くないアーティストも返信することになります。 –

+0

あなたのおかげです。ありがとうございます。私はアルバムなしでアーティストを保存することは意味がないと思いますが、もしそうなら、それを尊重するためにクエリを変更する必要があります。 – oezi

+0

シンプルな参加を追加できますが、おそらく不要なことに同意します –

4

あなたはアーティストのアルバムの数を見つけることGROUP BY句を使用することができます。このカウントをと比較すると、のカウントアップが作成されます。集約関数は、グループを排除するHAVING句内で使用することができる。

SELECT artist_id 
FROM albums 
GROUP BY artist_id 
HAVING COUNT(1) = COUNT(CASE WHEN picture_id THEN 1 ELSE NULL END) 

完全例:MIN()演算子を使用して、副選択せず

SELECT artist.artist_id, artist.name 
FROM artist 
INNER JOIN albums ON artist.artist_id = albums.artist_id 
GROUP BY artist.artist_id, artist.name 
HAVING COUNT(album_id) = COUNT(CASE WHEN picture_id THEN 1 ELSE NULL END) 
+0

アーティスト1には1枚のアルバムがあり、結果セットには存在しますが、これは期待どおりに機能しません。 – oezi

+0

いいえ、そのようなアーティストは表示されません。 –

+0

+1 - 申し訳ありませんが、あなたが正しいです - 私はあなたの質問を最初に読んだことを忘れてしまいました。 – oezi

0

別の解決策、 - 最小値はすべて、TRUEの場合値が真である:

SELECT artists.artist_id,MIN(picture_id) 
FROM artists 
INNER JOIN albums ON artists.artist_id = albums.artist_id 
GROUP BY artists.artist_id 
HAVING MIN(IFNULL(picture_id, 0)) > 0 

EDIT

のMod MIN()オペレータでnull値を0に置き換えるクエリがあれば、この方法ではよりクリーンです。

+0

私は知らない、私はちょっと尋ねる..何が起こるか1. picture_idにNULLがあるか、2. picture_idに ''(Empty String)がありますか? – Jayy

+0

正しく処理します。しかし、 "picture_id"カラムのタイプはわかりません。それがINTの場合、空の文字列を含むことはできません – tpolyak

0
$sql = mysql_query("SELECT DISTINCT table1.id, table2.id, table2.name 
FROM table1, table2 WHERE id=id GROUP BY name"); 

これを試してください。確かにそれは動作します。 乾杯!

関連する問題