这个SQL怎么了?它应返回结果但不返回任何内容
SELECT `pid`
FROM `products`
LEFT JOIN `prods_to_features`
ON (`ptf_pid` = `pid`)
WHERE ( `ptf_id` = '66'
OR `ptf_id` = '67'
)
AND (`ptf_id` = '76')
是否不能为左连接中使用的表设置第二个where子句?
答案 0 :(得分:7)
看看你的WHERE子句。
您不能同时拥有值(66 OR 67) AND 76
。每个行都将为表达式返回false,因此不会返回任何行。
答案 1 :(得分:5)
问题与您的加入无关。
您检查
(`ptf_id` = '66' OR `ptf_id` = '67') AND (`ptf_id` = '76')
与
相同 (`ptf_id` = '66' AND `ptf_id` = '76' )
OR (`ptf_id` = '67' AND `ptf_id` = '76')
这意味着ptf_id = 66 = 76
或ptf_id = 67 = 76
,这是不可能的。
答案 2 :(得分:4)
正如其他人所说,WHERE子句毫无意义。
我猜你想说的是你想要的产品具有-76并具有66或67的功能。你需要两个连接:
SELECT DISTINCT products.pid
FROM products
JOIN prods_to_features AS ptf1 ON ptf1.ptf_pid=products.pid
JOIN prods_to_features AS ptf2 ON ptf2.ptf_pid=products.pid
WHERE ptf1.ptf_id='76'
AND ptf2.ptf_id IN ('66', '67')
DISTINCT旨在确保在产品同时具有66和67功能的情况下仅返回产品的一个副本。
答案 3 :(得分:2)
问题在于,您要求它返回prods_to_features
的{{1}}记录,这些记录具有ptf_id
的两个不同值(您的Where子句中的AND
)。
我怀疑你在Where子句中的一个或两个pid
可能意味着ptf_id
。这取决于你想要做什么。
答案 4 :(得分:2)
您的布尔逻辑存在缺陷。
WHERE(ptf_id = 66或67)和(ptf_id = 76)
这将永远不会奏效。