MySQL加入问题

时间:2010-05-17 14:36:26

标签: sql mysql

这个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子句?

5 个答案:

答案 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 = 76ptf_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)

这将永远不会奏效。