繁体   English   中英

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

[英]mysql query on the same column filtered by 2 different values

我有一张产品表,我确定有一个产品 (ID= 18) 属于第 2 类,其标签名为“color”,值为“jeans”,名为“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。 但是如果我删除标签上的一个子句,它就可以完美地工作。 这是有效的(我只用面料或意大利语中的“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 个检查有什么问题? 它背后的逻辑是什么? 谢谢

为了在列对之间具有优先级,请尝试以下操作:

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 
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

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

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 

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM