In 另一个答案 https://stackoverflow.com/a/22750898/251311我发现了一个奇怪的语法:
(SELECT * FROM `articles`
WHERE date >= UNIX_TIMESTAMP(DATE(NOW() - INTERVAL 30 DAY))
ORDER BY `views` DESC
LIMIT 20
) ORDER by `views` ASC
不过mysql执行得很好。
为什么我认为它应该失败:
- 子查询没有别名
- 整个查询缺少
SELECT
clause
我发现它的运行出乎意料,并且没有解释它为什么有效。
它不符合定义的语法https://dev.mysql.com/doc/refman/5.5/en/select.html https://dev.mysql.com/doc/refman/5.5/en/select.html
那么,为什么它是有效的呢?有参考资料吗?
这是替代方案UNION
带有结尾的语法ORDER BY
.
这就是两个选择之间的联合的样子:
(SELECT ...)
UNION
(SELECT ...) ORDER BY ... LIMIT ...
这就是这样的联盟one选择看起来像:
(SELECT ...) ORDER BY ... LIMIT ...
与子查询完全无关。
MySQL 中没有记录这一点,但从语法 https://github.com/twitter/mysql/blob/master/sql/sql_yacc.yy#L7322:
top_level_select_init:
SELECT_SYM
{
Lex->sql_command= SQLCOM_SELECT;
}
select_init2
| '(' select_paren ')' union_opt
;
/* Need select_init2 for subselects. */
union_select_init:
SELECT_SYM select_init2
| '(' select_paren ')' union_opt
;
...
union_opt:
/* Empty */ { $$= 0; }
| union_list { $$= 1; }
| union_order_or_limit { $$= 1; }
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)