2012-07-06 93 views
0

有人可以解释我这个。我的SQL:SQL调试 - 忽略条件

SELECT 
    `offers`.`id`, 
    `offers`.`max_available`, 
    (SELECT COUNT(coupons.id) FROM coupons WHERE coupons.status = 'Y' AND coupons.offer_id = offers.id) AS coupons_sold 
FROM 
    `offers` 
WHERE 
    `offers`.`status` IN ('P', 'S') AND 
    `offers`.`published_at` < 1341612000 AND 
    `offers`.`end_at` >1341567914 AND 
    `coupons_sold` < `offers`.`max_available` 
ORDER BY `offers`.`created_at` DESC 
LIMIT 4 OFFSET 0 

这将返回我这4行:

id  max_available coupons_sold 
195  19    20 
194  9999   0 
193  9999   0 
159  9999   93 

怎么可能与ID 195行被包括在内,如果我有在coupons_sold < offers.max_available这种状况呢?我无能为力!

+0

简化测试的情况下抛出'未知列“coupons_sold”中“,其中clause'' http://sqlfiddle.com/#!2/a1b71/2确定没有别的'coupons_sold'的名字呢? – biziclop 2012-07-06 10:22:36

+0

使用别名时出错,不能在where子句中使用http://dev.mysql.com/doc/refman/5.6/en/problems-with-alias.html – Yaroslav 2012-07-06 10:32:19

回答

3

此查询会产生一个错误,因为您不能在WHERE子句中使用,该子句是SELECT列表中的别名。除非表offers也有coupons_sold列!

尝试此查询,而不是:

SELECT id, max_available, coupons_sold 
FROM 
    (SELECT 
     `offers`.`id`, 
     `offers`.`max_available`, 
     (SELECT COUNT(coupons.id) 
      FROM coupons 
      WHERE coupons.status = 'Y' 
      AND coupons.offer_id = offers.id 
     ) AS coupons_sold 
     offers.created_at 
    FROM 
     `offers` 
    WHERE 
     `offers`.`status` IN ('P', 'S') AND 
     `offers`.`published_at` < 1341612000 AND 
     `offers`.`end_at` >1341567914 
) AS tmp 
WHERE coupons_sold < max_available 
ORDER BY created_at DESC 
    LIMIT 4 OFFSET 0 ; 
+0

...但是如何使'coupons_sold'可见OP的原始查询中的WHERE部分?只有'GROUP BY'和'HAVING'应该可见。 – biziclop 2012-07-06 10:30:15

+0

@biziclop:我唯一的猜测是,表'offers'也有'coupons_sold'列!否则,它会抛出一个错误,因为你正确地comemnt。 – 2012-07-06 10:32:55

+0

另一种情况是,OP没有把整个查询放在问题中...... – 2012-07-06 10:35:04