2015-09-20 114 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已经很好的优化(假设合适的指数)。