创建视图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提前!
答案 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}}