Mysql UNION和ORDER BY的用法不正确?
如何在mysql中使用union和orderbyMysql UNION和ORDER BY的用法不正确?,mysql,sql-order-by,union,Mysql,Sql Order By,Union,如何在mysql中使用union和orderby select * from _member_facebook inner join _member_pts ON _member_facebook._fb_owner=_member_pts._username where _member_facebook._promote_point = 9 ORDER BY RAND() limit 2 UNION ALL select * from _member_facebook inner
select * from _member_facebook
inner join _member_pts
ON _member_facebook._fb_owner=_member_pts._username
where _member_facebook._promote_point = 9
ORDER BY RAND() limit 2
UNION ALL
select * from _member_facebook
inner join _member_pts
ON _member_facebook._fb_owner=_member_pts._username
where _member_facebook._promote_point = 8 limit 3
告诉我错误
#1221 - Incorrect usage of UNION and ORDER BY
有人能帮忙吗?试试:
(
select
*
from
_member_facebook
inner join
_member_pts
ON
_member_facebook._fb_owner=_member_pts._username
where
_member_facebook._promote_point = 9
ORDER BY RAND()
limit 2
)
UNION ALL
(
select
*
from
_member_facebook
inner join
_member_pts
ON
_member_facebook._fb_owner=_member_pts._username
where
_member_facebook._promote_point = 8
limit 3
)
尽管如此,我认为您应该将ORDER BY
子句放在第二个查询的末尾,并用括号括起来:
(
SELECT *
FROM _member_facebook
INNER JOIN _member_pts
ON _member_facebook._fb_owner =_member_pts._username
WHERE _MEMBER_FACEBOOK._PROMOTE_POINT = 9
ORDER BY RAND()
LIMIT 2
)
UNION ALL
(
SELECT *
FROM _MEMBER_FACEBOOK
INNER JOIN _MEMBER_PTS
ON _MEMBER_FACEBOOK._FB_OWNER =_MEMBER_PTS._USERNAME
WHERE _MEMBER_FACEBOOK._PROMOTE_POINT = 8
LIMIT 3
)
也就是说,MySQL不一定要在outer子句中保留内部排序,尽管它可能会这样做,因为它无论如何都需要对行进行排序,以计算相应的LIMIT
子句。解释:
理解这是如何工作的,以避免类似用例中的“陷阱”,这一点很重要。请注意,union
的语法有些“特殊”:
子状态union all
substationunion all
substation[order by
-clause][limit
-clause]
其中“子状态”可以选择由(
和)
包围。一些工作实例:
where
,分组依据
,拥有
,加入
,限制
,但不能包含订单依据
如果要使用排序依据,则包含排序依据的“substation”必须用大括号括起来。(这意味着它们不再是可选的。)
现在,如果我们再看看语法:
子状态union all
substationunion all
substation[order by
-clause][limit
-clause]
我们可以看到,整个union
语句以可选的order by
/limit
结束。这两个关键字适用于整个union
语句,而不仅仅是最后一个“substation”:
limit
关键字也可以应用于单个“子状态”:
limit
应用于最后一个“子状态”(与整个union
语句相反),则必须用大括号将最后一个“子状态”括起来:
limit
应用于最后一个“substation”以及整个union
语句,请使用:
order by
是没有意义的,因为文档明确说明order by
仅保证()在应用于整个union
语句时有效:
  ..对单个SELECT
语句使用orderby
并不意味着行在最终结果中的显示顺序
在“子状态”中,order by
唯一有意义的方法是将其与limit
结合使用:
  ..在此上下文中,ORDER BY的使用通常与LIMIT
结合使用,因此它用于确定要为SELECT
检索的选定行的子集,即使它不一定影响最终UNION
结果中这些行的顺序
此外,如果您想与联合
,则需要注意更多的“陷阱”。关于这一点,请参见。正确答案是:
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 9 LIMIT 2)
UNION ALL
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 8 LIMIT 3)
ORDER BY 1
试试看我喜欢什么
(SELECT CITY,LENGTH(CITY) FROM STATION WHERE LENGTH(CITY)=(SELECT MIN(LENGTH(CITY)) FROM STATION) ORDER BY CITY LIMIT 1)
UNION ALL
(SELECT CITY,LENGTH(CITY) FROM STATION WHERE LENGTH(CITY)=(SELECT MAX(LENGTH(CITY)) FROM STATION) ORDER BY CITY LIMIT 1);
我认为如果你使用order by或limit或两者都使用,则必须使用括号。我尝试使用limit和order by来处理一个查询,但没有括号,因此查询不起作用。它只在添加括号后才起作用。使用括号修复了我在查询中使用Order by和limit子句时的问题。我的要求是在一定条件下获得表中的顶行和底行,下面的代码适用于我:
(SELECT column1, column2
FROM table1
ORDER BY column1, column2
LIMIT 1)
UNION
(SELECT column1, column2
FROM table2
ORDER BY column1, column2
LIMIT 1)
是的,我也漏掉了括号,加上它修复了它
mysql> select 1
-> union all
-> select 2 limit 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql>
mysql> select 1 limit 1
-> union all
-> select 2;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
mysql> select 1
-> union all
-> (select 2 limit 1);
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
mysql> select 1
-> union all
-> (select 2 limit 1)limit 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql>
mysql> select 1
-> union all
-> (select 2 order by 1)order by 1;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 9 LIMIT 2)
UNION ALL
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 8 LIMIT 3)
ORDER BY 1
(SELECT CITY,LENGTH(CITY) FROM STATION WHERE LENGTH(CITY)=(SELECT MIN(LENGTH(CITY)) FROM STATION) ORDER BY CITY LIMIT 1)
UNION ALL
(SELECT CITY,LENGTH(CITY) FROM STATION WHERE LENGTH(CITY)=(SELECT MAX(LENGTH(CITY)) FROM STATION) ORDER BY CITY LIMIT 1);
(SELECT column1, column2
FROM table1
ORDER BY column1, column2
LIMIT 1)
UNION
(SELECT column1, column2
FROM table2
ORDER BY column1, column2
LIMIT 1)