[英]fastest way to select row from table1 which is not in table 2
我有兩張桌子
table1
=======================================
tid subcategory category
---------------------------------------
1 SUBCATEGORY1 CATEGORY1
2 SUBCATEGORY1 CATEGORY2
3 SUBCATEGORY2 CATEGORY1
4 SUBCATEGORY3 CATEGORY1
5 SUBCATEGORY4 CATEGORY1
6 SUBCATEGORY5 CATEGORY1
7 SUBCATEGORY6 CATEGORY1
8 SUBCATEGORY7 CATEGORY1
9 SUBCATEGORY8 CATEGORY1
10 SUBCATEGORY9 CATEGORY1
table2 //which have more than 600k rows
=======================================
t2id subcategory category pid
---------------------------------------
1 SUBCATEGORY1 CATEGORY1 1
2 SUBCATEGORY1 CATEGORY2 1
3 SUBCATEGORY2 CATEGORY1 1
我嘗試顯示不在table2中的table1的所有行,結果應該是這樣的......
=======================================
tid subcategory category
---------------------------------------
4 SUBCATEGORY3 CATEGORY1
5 SUBCATEGORY4 CATEGORY1
6 SUBCATEGORY5 CATEGORY1
7 SUBCATEGORY6 CATEGORY1
8 SUBCATEGORY7 CATEGORY1
9 SUBCATEGORY8 CATEGORY1
10 SUBCATEGORY9 CATEGORY1
我正在使用這個查詢,它對我有用,但它需要很多時間請告訴我最快的方法
SELECT t1.tid, t1.subcategory, t1.category
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2
WHERE t2.pid = '1'
AND t2.subcategory = t1.subcategory
AND t2.category = t1.category);
我正在使用 php 和 mysql..
您的查詢很好——甚至可能是最好的方法。
但是,對於此查詢:
SELECT t1.tid, t1.subcategory, t1.category
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
FROM table2 t2
WHERE t2.pid = 1 AND -- pid is probably a number so do not use single quotes
t2.subcategory = t1.subcategory AND
t2.category = t1.category
);
為了使該查詢具有良好的性能,您需要table2(category, subcategory, pid)
上的索引。
您沒有回復我的評論,但我想這是您正在尋找的解決方案:)
SELECT DISTINCT table1.* FROM table1
LEFT JOIN table2 ON table1.tid = table2.t1id
WHERE table2.t2id IS NULL
這應該比NOT EXISTS
更快,但您必須在table2
中有一個額外的字段,它接受來自table1
的tid
。 這在兩個表之間建立了關系。 但是,如果table2
中的pid
存儲來自table1
的tid
值(我在上面的評論中問過),那么您不需要創建額外的字段。 在這種情況下,只需將t1id
替換為pid
,它應該 go 就可以了。 現在比較速度,並在評論中告訴我們。
檢查小提琴: DB FIDDLE
根據您的評論,我假設類別,子類別組合可以在表 2 中針對不同的 pid 重復。如果是這樣,您可以在下面嘗試,
SELECT t1.tid, t1.subcategory, t1.category
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM
(SELECT category,subcategory,count(*)
FROM table2 t2
WHERE t2.pid = '1'
group by category,subcategory) t2
WHERE t2.subcategory = t1.subcategory
AND t2.category = t1.category);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.