mysql – 嵌套VIEW忽略ORDER BY
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 嵌套VIEW忽略ORDER BY,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3506字,纯文字阅读大概需要6分钟。
内容图文
![mysql – 嵌套VIEW忽略ORDER BY](/upload/InfoBanner/zyjiaocheng/909/7a27feb92f424a00b14301f5b8b2b82d.jpg)
与此类似的问题:
MySQL: View with Subquery in the FROM Clause Limitation
我有以下显示表:
DROP TABLE IF EXISTS `shows`;
CREATE TABLE `shows` (
`show_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`show_type` int(11) unsigned DEFAULT NULL,
`show_year` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`show_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `shows` VALUES
(NULL, 1, 2014), -- 1
(NULL, 1, 2015), -- 2
(NULL, 2, 2015), -- 3
(NULL, 2, 2014); -- 4
我想创建一个VIEW,它将为每个show_type返回show_id,以获得最高的show_year.这是一个有效的嵌套查询 – 返回2和3:
SELECT s.show_id, s.show_year
FROM ( -- subquery for applying ORDER BY before GROUP BY
SELECT *
FROM shows
ORDER BY show_year DESC
) s
GROUP BY show_type;
/*
+---------+-----------+
| show_id | show_year |
+---------+-----------+
| 2 | 2015 |
| 3 | 2015 |
+---------+-----------+
*/
仅供参考,我也尝试了以下对我来说很自然的查询,但最终在我的情况下并不好,如下所示:
SELECT s.show_id, MAX(s.show_year)
FROM shows s
GROUP BY show_type;
/*
+---------+------------------+
| show_id | MAX(s.show_year) |
+---------+------------------+
| 1 | 2015 | <== show_id=1 does NOT have show_year=2015
| 3 | 2015 |
+---------+------------------+
*/
现在创建一个VIEW – 基于上面的嵌套查询(第一个SELECT),问题是a view will not accept a subquery.
所以我使用了两个视图.一个在另一个里面.
第一个只是通过show_year DESC对表进行排序:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `shows_desc` AS
SELECT `s1`.`show_id` AS `show_id`,
`s1`.`show_type` AS `show_type`,
`s1`.`show_year` AS `show_year`
FROM `shows` `s1`
ORDER BY `s1`.`show_year` DESC;
第二个应该在第一个上执行GROUP BY:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `shows_grouped` AS
SELECT `s2`.`show_id` AS `show_id`,
`s2`.`show_year` AS `show_year`
FROM `shows_desc` `s2`
GROUP BY `s2`.`show_type`;
但是,令我惊讶的是它会返回错误的行.好像它组合忽略了子视图的ORDER:
+---------+-----------+
| show_id | show_year |
+---------+-----------+
| 3 | 2015 |
| 1 | 2014 | <== why?
+---------+-----------+
线索?
P.S.:SQL小提琴:http://sqlfiddle.com/#!2/e506d4/5
解决方法:
请注意我:
I want to create a VIEW that will return show_id for the highest
show_year for each show_type. Here’s a nested query that works –
returns 2 and 3:
这是一种方法,假设show_id递增,所以最近的show_id是最近一年:
select show_type, max(show_year) as show_year, max(show_id)
from shows
group by show_type;
如果没有,试试这个:
select show_type, max(show_year) as show_year,
substring_index(group_concat(show_id order by show_year desc), ',', 1) as show_id
from shows
group by show_type;
你的其他查询不起作用的原因是因为你对MySQL的工作方式有“如意”的理解.您正在使用明确表示不在documentation中工作的MySQL扩展.也就是说,select中的列不在聚合函数中且不在group by子句中(并且不依赖于函数,但这是一个与本讨论无关的非常先进的概念):
In this case, the server is free to choose any value from each group,
so unless they are the same, the values chosen are indeterminate,
which is probably not what you want.
编辑:
以下内容也适用于视图:
select s.*
from shows s
where s.show_year = (select max(s2.show_year) from shows s2 where s2.show_type = s.show_type);
编辑二:
如果每个show_type只需要一行,并且show_id是唯一的,那么这应该有效:
select s.*
from shows
where not exists (select 1
from shows s2
where s2.show_type = s.show_type and
(s2.show_year > s.show_year or
s2.show_year = s.show_year and s2.show_id > s.show_id
)
);
内容总结
以上是互联网集市为您收集整理的mysql – 嵌套VIEW忽略ORDER BY全部内容,希望文章能够帮你解决mysql – 嵌套VIEW忽略ORDER BY所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。