2013-03-09 52 views
4

我一直在處理這個查詢,並且它讓我瘋狂。MYSQL以最低值|取得記錄視圖的SELECT在FROM子句中包含一個子查詢

我有一個產品表和一個子產品表。 總之我想創建一個包含產品數據的視圖,以及子產品的最低(折扣)價格。 (想想襯衫,有幾個子產品(顏色/尺寸)等)

其次我想在VIEW中使用這個查詢,這部分是驅使我瘋了。

查詢我現在有:

SELECT m.* from product_items m join 
    (select product_id, min(price_discount) md 
     from product_items group by product_id) mm 
    on m.product_id=mm.product_id and m.price_discount=md 

此查詢工作,我取得好成績。但是現在我想創建一個視圖(vw_product_lowest)。 然後錯誤:ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause

任何人都可以幫助我將該查詢轉換爲兼容的查詢查詢?謝謝!

回答

6

根據手冊,VIEW不能包含子查詢。如果你真的想在你的查詢中創建一個VIEW,你需要爲你的子查詢的單獨視圖,前

第一種觀點

CREATE VIEW MinimumPrice 
AS 
SELECT product_id, MIN(price_discount) md 
FROM product_items 
GROUP BY product_id 

第二種觀點

CREATE VIEW MinimumPriceList 
AS 
SELECT m.* 
FROM product_items m 
     INNER JOIN MinimumPrice mm 
      ON m.product_id = mm.product_id AND 
       m.price_discount = mm.md 

查詢主視圖,

SELECT * FROM MinimumPriceList 

A view definition is subject to the following restrictions: FROM MySQL MANUAL

  • SELECT語句不能包含FROM子句中的子查詢。
  • SELECT語句不能引用系統或用戶變量。
  • 在存儲的程序中,定義不能引用程序參數或局部變量。
  • ....
+0

謝謝!我現在正在工作。這有點迂迴,但是再一次;它工作。謝謝你!! – SativaNL 2013-03-09 12:09:21

+0

由於性能原因,嵌套視圖不是很糟糕嗎? – Nuzzolilo 2015-10-22 02:17:03

9

您有幾種選擇:

  1. 將子查詢到一個視圖(可能是緩慢的,因爲結果視圖沒有索引,在其上進行後續的聯接):

    CREATE VIEW mm AS 
        SELECT product_id, MIN(price_discount) price_discount 
        FROM  product_items 
        GROUP BY product_id 
    ; 
    
    CREATE VIEW my_view AS 
        SELECT * FROM product_items m NATURAL JOIN mm 
    ; 
    
  2. 使用correlated subquery(也可能很慢,因爲子查詢必須針對表中的每個記錄進行評估 - 最佳性能將通過(product_id, price_discount)上的複合索引獲得):

    CREATE VIEW my_view AS 
        SELECT * FROM product_items m WHERE price_discount = (
        SELECT MIN(mm.price_discount) 
        FROM product_items mm 
        WHERE mm.product_id = m.product_id 
    ) 
    ; 
    
  3. 優化相關子查詢using the EXISTS strategy(也將從綜合指數受益於(product_id, price_discount)):

    CREATE VIEW my_view AS 
        SELECT * FROM product_items m WHERE NOT EXISTS (
        SELECT 1 
        FROM product_items mm 
        WHERE mm.product_id  = m.product_id 
         AND mm.price_discount < m.price_discount 
        LIMIT 1 
    ) 
    ; 
    
+0

哇。謝謝您的回答。儘管我確實使用了其他答案,但我會研究它。另一個答案在速度/優化方面似乎更好。 – SativaNL 2013-03-09 12:10:30

相關問題