2012-06-25 138 views
0

我有一個名爲「products」的表,其中包含以下數據。選擇查詢的反轉結果

-------------------- 
| id | tag_name | 
-------------------- 
| 1 | electronics | 
| 1 | tv   | 
| 1 | lcd   | 
| 2 | tv   | 
| 2 | lcd   | 
| 3 | tv   | 
| 3 | lcd   | 
-------------------- 

所有產品都有「電子」標籤是強制性的,但很少有產品缺少該標籤。根據我的問題上面的數據,我運行了哪些查詢,以便它返回ids 2 & 3,因爲它們沒有'電子'標籤。

2解決方案,腦海中出現

  1. 使用NOT IN - select distinct id from products where id not in (select id from products where tag_name='electronics') - 具有良好的幾百萬行,這是非常低效的

  2. 第二種解決方案是湊齊了一個腳本,選擇所有不同的ID,然後檢查該ID是否存在「電子」標籤,如果不是,則插入該行。

是否還有另一種更有效的方式來處理? (可在同一個表使用JOIN

+0

一種方法是刪除所有'ELECTRONICS'標籤,然後重新進行添加的所有ID – Dancrumb

+1

@Dancrumb:或創造獨特的複合指數(無論如何應該有一個),並插入忽略:-) – zerkms

回答

0

如何這樣的事情,我想在本地,它似乎工作

SELECT DISTINCT p1.id 
    FROM products p1 
    LEFT JOIN products p2 ON p1.id = p2.id AND p1.tag_name != p2.tag_name 
WHERE p1.tag_name != 'electronics' and p2.id IS NULL 
+0

這將選擇id = 1。因爲1)tv!= lcd 2)tv(或lcd)!=電子 – zerkms

+0

我不確定你在說什麼,你有沒有在本地測試它以確認結果? – Bryan

+0

查詢是微不足道的,所以我沒有看到任何重現它的原因。對你來說不是很明顯嗎? – zerkms

1
SELECT DISTINCT t1.id 
FROM products t1 
LEFT JOIN products t2 ON t2.tag_name = 'electronics' AND t1.id = t2.id 
WHERE t2.id IS NULL 

http://sqlfiddle.com/#!2/8d805/2

+0

*清理評論,我被告知廢話,現在我意識到這是沒有道理的。 –

2
INSERT INTO products 
SELECT a.id, 'electronics' 
FROM products a 
LEFT JOIN products b ON a.id = b.id AND b.tag_name = 'electronics' 
WHERE b.id IS NULL 
GROUP BY a.id 

這將實際上更新了products表,給所有沒有它的產品提供'電子'標籤。

http://sqlfiddle.com/#!3/f312a/1/0

不過,如果你只想選擇id S的不具有特定的標籤,然後使用zerkms的solution。因爲不是所有的id■找就可以了electronics TAG_NAME

+0

這個確切的查詢將失敗,列錯誤模糊 – zerkms

+0

Woops *,迅速修復。 –

+0

你也喜歡sqlfiddle,不是嗎? ;-) – zerkms

2

JOIN不會在你的情況下工作。

就試試這個:

SELECT DISTINCT id 
    FROM Products 
GROUP BY id 
    HAVING not GROUP_CONCAT(tag_name) like CONCAT('%','electronics','%') 

view here from demo: SQLFiddle.com

+0

'JOIN'不會,但'LEFT JOIN'會。此查詢沒有任何機會進行優化,並以任何方式導致表fullscan – zerkms