2012-01-23 61 views
2

請幫助提出請求。從兩個表中篩選數據

有兩個表,artistalbum。 我只想選擇那些相冊包含圖片的藝術家。 也就是說,如果演員有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); 

編輯:
如果您存儲了沒有相冊的藝術家,也必須排除這些相冊(請參閱評論以獲得解釋)。在這種情況下,你必須添加喜歡的東西:

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) 

完整示例:

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有一個專輯和一個沒有圖片,它會呈現在你的結果集中,但不應該,所以這不能按預期工作。 – oezi

+0

不,它不會顯示這樣的藝術家。 –

+0

+1 - 對不起,你是對的 - 我一讀missunderstodd查詢。 – oezi

0

另一種解決方案,沒有子查詢,使用MIN()操作員 - 如果最小爲TRUE,則所有值爲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 

編輯

國防部如果查詢在MIN()運算符處用0代替空值,則這種方法更簡潔。

+0

我不知道,即時只是問..會發生什麼1.如果picture_id有NULL或2. picture_id有''(空字符串)? – 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"); 

試試這個。當然,它的作品。 乾杯!