WHERE子句返回结果而不考虑子查询

时间:2012-04-13 10:19:04

标签: mysql subquery

我使用子查询返回类别及其下的所有子类别的产品。这是它的sql查询:

SELECT
    ca.categoryid, p.*, FLOOR(prodratingtotal/prodnumratings) AS prodavgrating, 0 AS prodgroupdiscount
FROM
    cart_categoryassociations ca, cart_products p
WHERE
    p.prodvisible=1 AND p.prodfeatured=1 AND (ca.categoryid=47 OR ca.categoryid IN (SELECT categoryid FROM cart_categories WHERE catparentid=47))

当我运行它时,它会仅根据p.prodvisible=1 AND p.prodfeatured=1部分返回结果,忽略(ca.categoryid=47 OR ca.categoryid IN (SELECT categoryid FROM cart_categories WHERE catparentid=47))部分。

(换句话说,它会带回系统中的所有特色产品,即使它们不属于子查询中提到的类别)

P.S:我已尝试单独在括号中运行该部件,并返回正确的类别。

MySQL版本5.0.8。

2 个答案:

答案 0 :(得分:1)

FROM
cart_categoryassociations ca, cart_products p

我不知道您的数据库结构,但不应该使用左连接而不是完整连接。这是故意的吗?

答案 1 :(得分:1)

WHERE
    p.prodvisible=1 AND p.prodfeatured=1 AND (ca.categoryid=47 OR ca.categoryid IN (SELECT categoryid FROM cart_categories WHERE catparentid=47))

我认为这将返回与p.prodvisible=1 AND p.prodfeatured=1匹配的cart_products中的所有行,用于(ca.categoryid=47 OR ca.categoryid IN (SELECT categoryid FROM cart_categories WHERE catparentid=47))子句匹配的每一行。

不要cart_products拥有cart_categories的某种外键吗? 然后你可以添加:

AND p.categoryid=ca.categoryid