2016-01-07 147 views
0

在我的應用程序中,我有一個通過其ID標識資源(即圖片)的表。所述資源也被「標記」(字段1)。即下表中的圖片3用'A'和'B'標記。而圖片1僅標有'A',而圖片2標有'B'。MySQL:返回具有相同ID但具有不同字段的所有行

這裏是我的「標籤」表:

+--------------+ 
| id | field1 | 
+--------------+ 
| 1 |  A | 
| 2 |  B | 
| 3 |  A | 
| 3 |  B | 
+--------------+ 

注意:ID是唯一既沒有,也沒有自動遞增。

問題:我想返回標記爲'B'的所有圖片,但我不想返回標記爲'A'的任何圖片。

圖片中的SELECT ID WHERE field1 ='B';

返回:

+-----+ 
| id | 
+-----+ 
| 2 | 
| 3 | 
+-----+ 

這不是要我要,因爲它包括圖片3也被標記爲「A」(在該行中緊接在前的[3,B]在原始表)

我想:

+-----+ 
| id | 
+-----+ 
| 2 | 
+-----+ 
+0

你怎麼能有一個重複的ID? – genespos

+0

@genespos它不是一個獨特的ID。 – m0rph3us

+0

定義'上一行' - 或者行不是'上一個'? – Strawberry

回答

1

這裏有兩種方法:

存在子條款:

SELECT id 
from pictures as pictures1 
WHERE field1 = 'B' 
and not exists ( 
    select * 
    from pictures as picutures2 
    where pictures2.id = pictures1.id 
    and pictures2.field1 = 'A'); 

左連接:

Select pictures1.id 
from pictures as pictures1 
left join pictures as picutures2 on 
    pictures2.id = pictures1.id 
    and pictures2.field1 = 'A' 
where pictures1.field1 = 'B' 
and pictures2.ID is null -- this line eliminates records where the join fails; note that if you have this line, you must not put any other pictures2 references in this where clause 

;

0

你與你的要求就開始了。只要取消選擇行,其中字段1是A:

SELECT id from pictures WHERE field1 = 'B' AND id NOT IN(
    SELECT id from pictures WHERE field1 = 'A' 
); 
0

您也可以在一個查詢中使用一些聚集達到您想要的結果

select id 
from table1 
group by id 
having sum(field1 = 'B') > 0 
and sum(field1 = 'A') = 0 

DEMO

0
SELECT id 
FROM pictures 
GROUP BY id 
HAVING (GROUP_CONCAT(DISTINCT fuild1)) = 'B' 
相關問題