同一列上的mysql查询由2个不同的值过滤

时间:2015-11-24 12:06:41

标签: mysql mysqli

我有一张产品表,我肯定知道我的产品(ID = 18)属于第2类,有一个名为"颜色"有价值"牛仔裤"和一个名为" fabric"有价值"牛仔布"。

产品,产品标签,产品图片,产品选项是我尝试以这种方式加入的不同相关表格:

SELECT *, p.id as pid FROM prodotti_immagini pi 
LEFT JOIN prodotti p ON pi.prodotto = p.sku 
LEFT JOIN prodotti_opzioni po ON po.prodotto = p.id 
LEFT JOIN prodotti_tags pt ON pt.prodotto = p.id 

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 
AND pt.tag = 'colore' 
AND pt.val_it LIKE '%jeans%' 
AND pt.tag = 'tessuto' 
AND pt.val_it LIKE '%denim%' 
GROUP BY p.id 

我没有获得产品id = 18,而是获得了一个空的记录集。 但是如果我删除标签上的一个子句,它就可以完美地运行。这是工作的(我只用面料过滤或#34; tessuto"意大利语)

SELECT *, p.id as pid FROM prodotti_immagini pi 
LEFT JOIN prodotti p ON pi.prodotto = p.sku 
LEFT JOIN prodotti_opzioni po ON po.prodotto = p.id 
LEFT JOIN prodotti_tags pt ON pt.prodotto = p.id 

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 
AND pt.tag = 'tessuto' 
AND pt.val_it LIKE '%denim%' 
GROUP BY p.id 

在同一列上进行2次检查有什么不对?它背后的逻辑是什么?谢谢

2 个答案:

答案 0 :(得分:2)

为了在列对之间具有优先权,请尝试:

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 
AND (
           ( pt.tag = 'colore' AND pt.val_it LIKE '%jeans%' )
       OR  ( pt.tag = 'tessuto' AND pt.val_it LIKE '%denim%' )
)

GROUP BY p.id 

编辑:其他方式,使用联接:

SELECT *, p.id as pid FROM prodotti_immagini pi 
LEFT JOIN prodotti p ON pi.prodotto = p.sku 
LEFT JOIN prodotti_opzioni po ON po.prodotto = p.id 

LEFT JOIN prodotti_tags pt ON 
    pt.prodotto = p.id 
    AND  ( pt.tag = 'colore' 
    OR  pt.val_it LIKE '%jeans%' 
    OR  pt.tag = 'tessuto' 
    OR pt.val_it LIKE '%denim%' )

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 

GROUP BY p.id 

答案 1 :(得分:1)

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 
AND pt.tag = 'colore' 
AND pt.val_it LIKE '%jeans%' 
AND pt.tag = 'tessuto' 
AND pt.val_it LIKE '%denim%' 
GROUP BY p.id 

根据此查询条件,您正在使用值为pt.tag = 'colore' AND pt.tag = 'tessuto'的行,这是自相矛盾

这就是为什么空集。

那么一行怎么可以有两个不同的(tessuto & colore)值,它只能包含一个(tessuto OR colore

所以你应该看起来像这样(见OR& pt.tag中的pt.val_it

WHERE pi.principale = 1 AND p.disponibile=1 
AND categoria = 2 
AND (pt.tag = 'tessuto' OR pt.tag = 'colore' )
AND (pt.val_it LIKE '%denim%' OR pt.val_it LIKE '%jeans%')
GROUP BY p.id 

希望这有帮助。