2013-02-15 164 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子句`$有一個錯誤