簡體   English   中英

從表 1 到不在表 2 中的 select 行的最快方法

[英]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中有一個額外的字段,它接受來自table1tid 這在兩個表之間建立了關系。 但是,如果table2中的pid存儲來自table1tid值(我在上面的評論中問過),那么您不需要創建額外的字段。 在這種情況下,只需將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.

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