MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询
Posted
技术标签:
【中文标题】MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询【英文标题】:MYSQL Get record with lowest value | View's SELECT contains a subquery in the FROM clause 【发布时间】:2013-03-09 11:38:24 【问题描述】:我一直在处理这个查询,这让我抓狂。
我有一个产品表和一个包含子产品的表。 简而言之,我想用产品数据和子产品的最低(折扣)价格创建一个视图。 (想想一件衬衫,有几个子产品(颜色/尺寸)等)
其次,我想在 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
谁能帮我将该查询转换为兼容的 VIEW 查询?谢谢!
【问题讨论】:
【参考方案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
;
使用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
)
;
优化相关子查询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
)
;
【讨论】:
哇。谢谢您的回答。虽然我确实使用了其他答案,但我会调查它。就速度/优化而言,另一个答案对我来说似乎更好。【参考方案2】:根据手册,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 语句不能引用系统或用户变量。 在存储的程序中,定义不能引用程序参数或局部变量。 ....【讨论】:
谢谢!我现在可以工作了。这有点迂回,但又一次;它工作。谢谢你!! 由于性能原因,嵌套视图不是很糟糕吗?以上是关于MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询的主要内容,如果未能解决你的问题,请参考以下文章
如何针对mysql中的值选择除较低值记录之外的记录? [关闭]
ERROR 1356 (HY000): View 'mysql.user' references invalid table(s) or column(s) or function(s) or def