从连接表中选择字段的最小值

时间:2014-01-29 16:58:42

标签: mysql join views min

创建视图products_view AS

你好!我有树桌:

Products
Categories
Prices

产品属于一个类别,可能有更多价格。

考虑这组数据:

产品:

 id   title         featured    category_id 
 1   |    bread  |  yes      |    99
 2   |    milk   |  yes      |    99
 3   |    honey  |  yes      |    99

价格:

 id   product_id    price        quantity
 1   |    1      |  99.99      |   10   
 2   |    1      |  150.00     |   50
 3   |    2      |  33.10      |   20
 4   |    2      |  10.00      |   11

我需要创建一个视图,一个完整的产品列表,为每个产品选择最低价格和自己的类别。

例如

 id       title      featured     cat.name       price      quantity
 1    |    bread   |  yes      |    food       | 99.99    |   10 

我尝试了以下查询但是这样我只选择了最小的Price.price值,但是Price.quantity来自另一行。我应该找到最小的Price.price值,因此使用此行的Price.quantity作为正确的数据。

CREATE VIEW products_view
AS
SELECT `Prod`.`id`, `Prod`.`title`, `Prod`.`featured`, `Cat`.`name`, MIN(`Price`.`price`) as price,`Price`.`quantity`
FROM `products` AS `Prod`
LEFT JOIN `prices` AS `Price` ON (`Price`.`product_id` = `Prod`.`id`) 
LEFT JOIN `categories` AS `Cat` ON (`Prod`.`category_id` = `Cat`.`id`) 
GROUP BY `Prod`.`id` 
ORDER BY `Prod`.`id` ASC

我的结果是:

 id     title        featured    cat.name       price        quantity
 1    |    bread   |  yes     |    food       | 99.99      |  **50**     <-- wrong   
你能帮帮我吗? Thx提前!

1 个答案:

答案 0 :(得分:0)

正如MySQL Extensions to GROUP BY所述(强调补充):

  

在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中指定的非聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的name列未显示在GROUP BY中:

SELECT o.custid, c.name, MAX(o.payment)
  FROM orders AS o, customers AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;
     

要使查询合法,必须从选择列表中省略name列,或在GROUP BY子句中命名。

     

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未在ORDER BY中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,每个组中的值的选择不能是受添加ORDER BY子句的影响。选择值后会对结果集进行排序,SELECT Prod.id, Prod.title, Prod.featured, Cat.name, Price.price, Price.quantity FROM products AS Prod LEFT JOIN categories AS Cat ON Prod.category_id = Cat.id LEFT JOIN ( prices AS Price NATURAL JOIN ( SELECT product_id, MIN(price) AS price FROM prices GROUP BY product_id ) t ) ON Price.product_id = Prod.id ORDER BY Prod.id 不会影响服务器选择的每个组中的值。

您要找的是group-wise minimum,可以通过将分组结果加回到表中来获得:

{{1}}