簡體   English   中英

MySQL-選擇所有共享相同ID的行,每個行包含等於null的列

[英]MySQL - Select where all rows sharing the same id, each contain a column equal to null

嘗試用這個詞有點棘手,我先舉一個例子

表名:標簽

artist_id(int) | tag_id(int) | main_tag(NULL by default)

這些行可以為每個藝術家包含多個不同的標簽,並且其中一個需要設置為主標簽。

因此,我試圖找出所有當前未在行之一中設置主標簽的藝術家。

例:

artist_id | tag_id | main_tag
 2203         4         NULL
 2203         53         1
 2203         32        NULL

我不想在這里檢索藝術家ID,因為已為此藝術家設置了主要標簽。

鑒於:

artist_id | tag_id | main_tag
 1333         23       NULL
 1333         44       NULL

我要獲取此artist_id,因為所有main_tag值均為NULL。

我一直在堅持將其放入SQL語句中,將非常感謝您的幫助:)

因此,讓我們分解一下:

以下查詢返回您要忽略的藝術家:

SELECT artist_id 
FROM   tags 
WHERE  main_tag IS NOT NULL 

因此,您想要的人是不在上面列表中的artist_id的人:

SELECT artist_id, 
       tag_id 
FROM   tags 
WHERE  artist_id NOT IN (SELECT artist_id 
                         FROM   tags 
                         WHERE  main_tag IS NOT NULL); 

如果您只需要artist_id,並且每個藝術家只出現一次,則可以刪除對tag_id的引用,並按歌手分組:

SELECT artist_id 
FROM   tags 
WHERE  artist_id NOT IN (SELECT artist_id 
                         FROM   tags 
                         WHERE  main_tag IS NOT NULL) 
GROUP  BY artist_id; 

提示:如果您要發布數據庫式的東西,可以在sqlfiddle中構建表,然后發布鏈接,這為人們提供了一個起點。 我做到了,鏈接是http://sqlfiddle.com/#!2/db53d/2

以下查詢產生的結果與@AMADNON Inc.的查詢結果相同。

A.分組依據和擁有

SELECT artist_id
FROM tags
GROUP BY artist_id
HAVING SUM(main_tag IS NULL) = COUNT(*);

B.內聯接

SELECT DISTINCT t1.artist_id
FROM tags t1 INNER JOIN (
    SELECT artist_id 
    FROM tags WHERE main_tag IS NOT NULL
  ) t2 ON t1.artist_id != t2.artist_id;

C.不存在

SELECT DISTINCT artist_id
FROM tags t1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM tags
    WHERE main_tag IS NOT NULL 
        AND artist_id = t1.artist_id
);

如果您有很多數據,那么讓我知道每個查詢的性能結果會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM