Yud*_*ira 56 mysql union sql-order-by
我如何在mysql中使用union和order?
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
Run Code Online (Sandbox Code Playgroud)
给我错误
#1221 - Incorrect usage of UNION and ORDER BY
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮忙吗?
Tud*_*tin 78
试试:
(
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
)
Run Code Online (Sandbox Code Playgroud)
虽然,我认为您应该将该ORDER BY
子句放在第二个查询的末尾
Álv*_*lez 31
括号:
(
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
)
Run Code Online (Sandbox Code Playgroud)
说,MySQL并不强制要在外部子句中保留内部排序 - 尽管它可能会这样做,因为它需要对行进行排序以计算相应的LIMIT
子句.
Pac*_*ier 23
重要的是要了解这是如何工作以避免类似用例中的"陷阱".请注意,union
语法有些"特殊":
子
union all
语句union all
子order by
语句[-clause] [limit
-clause]
其中" 子语句 "可以选择性地被(
和包围)
.一些工作实例:
select 1 union all (select 2);
select 1 union all select 2 union all (select 3);
select 1 union all (select 2) union all select 3;
select 1 union all (select 2) union all (select 3);
select 1 union all (select 2) union all (select 3) union all select 4;
select 1 union all (select 2) union all select 3 union all (select 4);
Run Code Online (Sandbox Code Playgroud)但是,如果用大括号包围第一个" 子语句 ",则必须用括号括住所有其他" 子语句 ":
(select 1) union all (select 2) union all (select 3);
Run Code Online (Sandbox Code Playgroud)(请注意,官方文档中未提及上述要点.)
不这样做是语法错误:
mysql> (select 1) union all select 2; -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error in your SQL syntax; check the...
mysql> (select 1) union all (select 2) union all select 3; -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error...
mysql> (select 1) union all select 2 union all (select 3); -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error...
Run Code Online (Sandbox Code Playgroud)其次,每个" 子语句 "可以包含where
,group by
,having
,join
,limit
,但不是order by
.
如果您想使用order by
,包含的" 子语句 " order by
必须用大括号括起来.(这意味着它们不再是可选的.)
现在,如果我们再次查看语法:
子
union all
语句union all
子order by
语句[-clause] [limit
-clause]
我们可以看到整个union
语句以可选的order by
/ 结束limit
.这两个关键字适用于整个union
语句,而不仅仅是最后一个" 子语句":
mysql> select 1
-> union all
-> select 2 limit 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)我们之前已经提到limit
关键字也可以应用于单个" 子语句 ":
mysql> select 1 limit 1
-> union all
-> select 2;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)如果要应用于limit
最后一个" 子union
语句"(而不是整个语句),则必须用括号括起最后一个" 子语句":
mysql> select 1
-> union all
-> (select 2 limit 1);
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)要应用于limit
最后一个" 子语句" 以及 整个union
语句,请使用:
mysql> select 1
-> union all
-> (select 2 limit 1)limit 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)它与以下相同order by
:
mysql> select 1
-> union all
-> (select 2 order by 1)order by 1;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)但是请注意,申请order by
到" 子语句 " s是毫无意义的,因为该文档已明确表示这order by
才能得到保证(参见),当应用到整个工作union
的语句:
-§- ..
ORDER BY
对于单个SELECT
语句的使用并不意味着行在最终结果中出现的顺序.
order by
在" 子语句 "中唯一有意义的方法是将它与limit
以下内容结合起来:
-§- 在此上下文中使用..the ORDER BY的是典型地与结合
LIMIT
,使得它被用于确定所选择的行的子集来检索SELECT
,即使它并不一定会影响那些行的顺序在最后的UNION
结果.
此外,如果你想结合使用,还会有更多的"陷阱"需要注意.有关此问题,请参见问题32858.select into
union
归档时间: |
|
查看次数: |
37453 次 |
最近记录: |