申请" ORDER BY"在" UNION" (MySQL的)

时间:2017-05-02 15:40:39

标签: mysql sql-order-by union

美好的一天。 所以,每个标题都在标题中:)

我希望合并两个请求的结果并将结果一起排序(因为不是一个接一个)。 =>我正在考虑申请一个工会并订购它们。 它没有用。

我环顾四周on Stackdeveloppez (!!french website)。我尝试了不同的例子和建议,但没有成功。 从我的红色看来,因为我正在使用Mysql。

无论如何,这是我的尝试,结果:

我原来的2个请求

SELECT * FROM user_relation WHERE from_user_id = 1
List item
SELECT * FROM user_relation WHERE to_user_id = 1

这个列表的结果是由frh frist select(由索引键编排)的结果,然后是由Index KEy排序的第二个选择的结果。

尝试1:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)

请求已运行,但结果与原始请求相同:首先选择的结果(按索引键排序),然后是第二个请求的结果

尝试2:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)
ORDER BY trust_degree

=>请求运行,结果为尝试1,但警告我的Mysql逻辑: (此类关闭已经过分析(ORDER BY))

尝试3

(SELECT * FROM user_relation WHERE from_user_id = 1
UNION
SELECT * FROM user_relation WHERE to_user_id = 1)
ORDER BY trust_degree

=>不要运行,但是错误#1064 - UNION附近的语法错误

尝试4:

SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
)
ORDER BY trust_degree 

=>不跑,和一个很好的6错误列表。 有什么建议吗?

4 个答案:

答案 0 :(得分:4)

SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
) AS i
ORDER BY trust_degree

您必须为您的选择指定别名。但在这种情况下,UNION不是必需的,可以用简单的OR代替,正如@Karoly Horvath在他的评论中指出的那样。生成的查询如下所示:

SELECT 
 * 
FROM user_relation 
WHERE from_user_id = 1 OR to_user_id = 1 
ORDER BY trust_degree

答案 1 :(得分:4)

它写在documentation of UNION

  

要将ORDER BYLIMIT应用于个人SELECT,请将该子句放在括起SELECT的括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
     

...

     

ORDER BY个语句使用SELECT表示行在最终结果中的显示顺序,因为UNION默认情况下会生成一组无序行。

     

...

     

要使用ORDER BYLIMIT子句对整个UNION结果进行排序或限制,请为各个SELECT语句添加括号并放置ORDER BY或{ {1}}在最后一个之后。以下示例使用两个子句:

LIMIT
     

没有括号的语句相当于刚刚显示的一个括号。

通过将以上信息应用于您的查询,它变为:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

答案 2 :(得分:0)

SELECT a FROM t1 WHERE a=10 AND B=1
UNION
SELECT a FROM t2 WHERE a=11 AND B=2
ORDER BY 1 LIMIT 10;

如果您需要按更多字段进行排序,只需添加字段编号ORDER BY 1, 2, 3 LIMIT 10;

答案 3 :(得分:-2)

扩展我的评论:

SELECT * into #tempTable FROM (
   SELECT * FROM user_relation WHERE from_user_id = 1
   UNION
   SELECT * FROM user_relation WHERE to_user_id = 1
)
as x

SELECT * FROM #tempTable ORDER BY trust_degree
DROP TABLE #temptable