2013-02-15 47 views
0

结果集我有进行内SELECT并返回结果作为伪列的MySQL的语句。我想在我的WHERE子句中使用这个伪列的结果。我现在的SQL语句如下所示:过滤器的MySQL结果通过的内选择

SELECT 
    product.product_id, 
    product.range_id, 
    product.title, 
    product.image, 
    product.image_text, 
    product.friendly_url, 
    attribute.comfort_grade_id, 
    category.category_id, 
    category.category AS category_name, 
    category.friendly_url AS category_friendly_url, 
    (SELECT price_now FROM product_bedding_sizes AS size WHERE size.product_id = product.product_id ORDER BY size.price_now ASC LIMIT 1) AS price 
FROM 
    products AS product 
LEFT JOIN 
    categories AS category ON product.category_id = category.category_id 
LEFT JOIN 
    product_bedding_attributes AS attribute ON product.product_id = attribute.product_id 
$where 
$order 
LIMIT 
    ?,? 

不过,我得到运行查询时出现以下错误信息:

#1054 - 未知列 '价格' 在 'where子句'

我怎样才能解决这个问题,在我的WHERE条款实际使用的price价值?

+0

做到这一点哪里和你没有共享这个变量。 – 2013-02-15 16:37:53

+0

是的。无论是'$ where'和'$ order'变量构建的查询之外,但'$ where'将包含类似'WHERE价格> 0 AND'price' <= 199'。 – 2013-02-16 11:12:34

+0

你确定它的'price'列,而不是'price_now'因为它甾体抗炎药售价未知列 – 2013-02-16 11:15:08

回答

2

WHERE子句在SELECT子句之前被评估,因此它不会说别名。你所要做的由WHERE子句过滤器在这样一个外部查询:

SELECT * 
FROM 
(
    SELECT 
     product.product_id, 
     product.range_id, 
     product.title, 
     product.image, 
     product.image_text, 
     product.friendly_url, 
     attribute.comfort_grade_id, 
     category.category_id, 
     category.category AS category_name, 
     category.friendly_url AS category_friendly_url, 
     (SELECT price_now 
     FROM product_bedding_sizes AS size 
     WHERE size.product_id = product.product_id 
     ORDER BY size.price_now ASC 
     LIMIT 1) AS price 
    FROM 
    ... 
) AS sub 
WHERE price = ... <--- here it can see the price alias. 

有关详细信息,请参阅本:


或者:您可以加入该表,而不是相关子查询是这样的:

SELECT 
    product.product_id, 
    product.range_id, 
    product.title, 
    product.image, 
    product.image_text, 
    product.friendly_url, 
    attribute.comfort_grade_id, 
    category.category_id, 
    category.category AS category_name, 
    category.friendly_url AS category_friendly_url, 
    size.price_now 
FROM 
    products AS product 
LEFT JOIN 
(
    SELECT product_id, MIN(price_now) AS price 
    FROM product_bedding_sizes 
    GROUP BY product_id 
) AS size ON size.product_id = product.product_id 
LEFT JOIN 
    categories AS category ON product.category_id = category.category_id 
LEFT JOIN 
    product_bedding_attributes AS attribute ON product.product_id = attribute.product_id 
$where price = ----; 
+0

他有where子句'$ where'其自己的查询外定义,我认为 – 2013-02-15 16:34:41

+0

您需要在第二个解决方案'MIN(price_now)'和'GROUP BY product_id'派生表作为第一个工作。加入一个'LEFT JOIN',而不是内心。 – 2013-02-15 16:36:44

+0

@echo_me - 是的,他必须用同样的方式编写'WHERE'子句,但将其放在内部的外部查询no中,内部的子句在'where'子句中看不到'price'名称。 – 2013-02-15 16:37:16

0

尝试使用一个变量:

@price:= (SELECT price_now 
      FROM product_bedding_sizes AS size 
      WHERE size.product_id = product.product_id 
      ORDER BY size.price_now ASC LIMIT 1) AS price; 

然后引用它作为

WHERE @price > 9000; 
0

,如果你有

WHERE price > 0 AND price` <= 199` 
您的where子句中

然后尝试用HAVING子句

$HAVING 
     //-- where $having = HAVING price > 0 AND price <= 199 
您在where子句`$有一个错误