2015-09-20 37 views
1

我有一個產品表這樣的查找列失蹤組合兩個MySQL表

select distinct c.parentid, pc.productid, from products_categories pc 
join categories c on pc.categoryid = c.categoryid 
where concat(pc.productid,'-',c.parentid) not in (
select distinct concat(productid,'-',categoryid) from products_categories 
) 

然而這是非常緩慢的。有沒有辦法做到這一點與連接而不是在concat行? concat用於說明所有可能的組合。

+0

你究竟想幹什麼?什麼缺少行? –

+0

@HosseinMaktoobian缺少來自products_categories的行。即如果沒有productid/parentid(categoryid)組合不存在(parentid是從第二個表) –

回答

1

每次要添加一個前綴productID & -要麼parentIDcategoryID

你可以試試這個:

SELECT DISTINCT c.parentid, pc.productid 
FROM products_categories pc 
    JOIN categories c on pc.categoryid = c.categoryid 
WHERE c.parentid NOT IN (
    SELECT DISTINCT categoryid FROM products_categories 
) 

編輯1:犯規佔所有連擊

SELECT DISTINCT c1.parentid, pc.productid 
FROM products_categories pc 
    INNER JOIN categories c1 ON pc.categoryid = c1.categoryid 
    LEFT JOIN categories c2 ON c1.parentid = c2.categoryid 
WHERE c2.categoryid IS NULL 
+0

謝謝,但不佔所有組合 –

+0

thnx不完全相同。原來的查詢給了6500行,而這給了> 15k –

+0

再次感謝,但沒有給出相同的結果 –

0

要了解什麼是tbl_x但不是在tbl_y,做到這一點

SELECT ... 
    FROM  tbl_x 
    LEFT JOIN tbl_y USING(...) 
    WHERE tbl_y.id IS NULL; 

構造IN (SELECT ...)是非常差優化。 LEFT JOIN已經很好的優化(假設合適的指數)。