2013-03-05 55 views
1

我正在爲一家網上商店編碼。產品具有默認價格,但由於它可能具有不同的屬性(顏色,大小等),因此這些不同的屬性也可能導致不同的價格。目前,我正在嘗試生成一個mysql查詢,它可以幫助我查找產品的最低和最高可能價格。使用LEFT JOIN當前將查詢的結果減少到只有一行,我不知道爲什麼。左加入時獲得最低價格/結果減少

SELECT 
    products.id AS id, 
    categories.name AS category_name, 
    MIN(product_attributes.price) AS min_price, MAX(product_attributes.price) AS max_price, 
    products.* 
FROM products 
LEFT JOIN categories ON category_id=categories.id 
LEFT JOIN product_attributes ON products.id=product_attributes.product_id 

這甚至是正確的方法嗎?我不太瞭解MySQL,我只是試着去嘗試,如果它有效,我很高興。無論如何感謝您的幫助。

回答

2

你缺少在當前的查詢GROUP BY條款,但我會建議使用子查詢得到的結果:

SELECT 
    p.id AS id, 
    c.name AS category_name, 
    pa.min_price, 
    pa.max_price, 
    p.* 
FROM products p 
LEFT JOIN categories c 
    ON p.category_id = c.id 
LEFT JOIN 
(
    select MIN(product_attributes.price) min_price, 
     MAX(product_attributes.price) max_price, 
     product_id 
    from product_attributes 
    group by product_id 
) pa 
    ON p.id=pa.product_id 

的最主要的原因,我建議使用子查詢是因爲MySQL MySQL使用EXTENSION TO GROUP BY,它允許不執行FULL GROUP BY的行爲。

MySQL中的這種擴展可能會導致SELECT列表中不在GROUP BY子句或集合函數中的列中返回意外值。

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

1

你需要有GROUP BY條款,

SELECT 
    products.id AS id, 
    categories.name AS category_name, 
    MIN(product_attributes.price) AS min_price, 
    MAX(product_attributes.price) AS max_price. 
    products.* 
FROM products 
LEFT JOIN categories ON category_id=categories.id 
LEFT JOIN product_attributes ON products.id=product_attributes.product_id 
GROUP BY products.id, categories.name 

,但使用在MySQL GROUP BY時要小心,因爲如果ONLY_FULL_GROUP_BY默認情況下禁用的說法是完全有效的。

執行查詢的正確方法是使用子查詢,它可以分別獲得每個產品的最低價格。

SELECT a.id AS id, 
     b.name AS category_name, 
     c.minPrice, 
     c.maxPrice, 
     a.* 
FROM products a 
     LEFT JOIN categories b 
      ON a.category_id = b.id 
     LEFT JOIN product_attributes c 
     (
      SELECT product_id, 
        MIN(product_attributes.price) minPrice, 
        MAX(product_attributes.price) maxPrice 
      FROM product_attributes 
      GROUP BY product_id 
     ) d ON a.id = c.product_id