Mysql UNION和ORDER BY的用法不正确?

Mysql 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

如何在mysql中使用unionorderby

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
substation
union all
substation[
order by
-clause][
limit
-clause]

其中“子状态”可以选择由
包围。一些工作实例:

但是如果用大括号括住第一个“子状态”,则必须用大括号括住所有其他“子状态”:

(请注意,本手册中未提及上述要点。)

未能执行此操作是一个语法错误:

接下来,每个“子状态”可以包含
where
分组依据
拥有
加入
限制
,但不能包含
订单依据

如果要使用排序依据,则包含排序依据的“substation”必须用大括号括起来。(这意味着它们不再是可选的。)

现在,如果我们再看看语法:

子状态
union all
substation
union 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)