我有一张产品表,我肯定知道我的产品(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次检查有什么不对?它背后的逻辑是什么?谢谢
答案 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
希望这有帮助。