mysql rank的用法,sql - 在mysql中使用union和order by子句

sql - 在mysql中使用union和order by子句

我想在mysql查询中使用union with order。我根据不同的标准从基于距离的表中获取不同类型的记录,以便在我的网站上进行搜索。第一个选择查询返回与确切位置搜索相关的数据。第二个选择查询返回与距离搜索位置5公里内的距离相关的数据。第三个选择查询返回与距搜索地点5-15公里范围内的距离相关的数据。

然后我使用union来合并所有结果并在页面上显示分页。 在适当的标题下,确切的搜索结果','结果在5公里内' 等等

现在我想基于id或add_date对结果进行排序。 但是当我在查询结束时添加order by子句时(query1 union query 2 union query 3 order by add_date)。 它排序所有结果。 但我想要的是它应该在每个标题下排序。

9个解决方案

198 votes

您可以通过向每个选择添加一个名为rank的伪列来完成此操作,您可以先排序,然后按其他条件排序,例如:

select *

from (

select 1 as Rank, id, add_date from Table

union all

select 2 as Rank, id, add_date from Table where distance < 5

union all

select 3 as Rank, id, add_date from Table where distance between 5 and 15

) a

order by rank, id, add_date desc

RedFilter answered 2019-07-08T16:38:34Z

40 votes

您可以使用子查询执行此操作:

select * from (select values1 from table1 order by orderby1) as a

union all

select * from (select values2 from table2 order by orderby2) as b

rickythefox answered 2019-07-08T16:39:04Z

25 votes

(select add_date,col2 from table_name)

union

(select add_date,col2 from table_name)

union

(select add_date,col2 from table_name)

order by add_date

Mitali answered 2019-07-08T16:39:22Z

8 votes

别忘了,union all是一种在没有排序或合并(而不是联合)的情况下将记录添加到记录集的方法。

例如:

select * from (

select col1, col2

from table a

order by col3

limit by 200

) a

union all

select * from (

select cola, colb

from table b

order by colb

limit by 300

) b

它使各个查询更清晰,并允许您按每个查询中的不同参数进行排序。 但是,通过使用所选答案的方式,它可能会变得更加清晰,具体取决于复杂程度以及数据的相关性,因为您正在对排序进行概念化。 它还允许您将人工列返回到查询程序,以便它具有可以排序或组织的上下文。

但是这种方式的优点是速度快,不会引入额外的变量,并且可以轻松地分离出包括排序在内的每个查询。 添加限制的能力只是额外的奖励。

当然可以随意将union all转换为union,并为整个查询添加一个排序。 或添加一个人工ID,在这种情况下,这种方式可以很容易地按每个查询中的不同参数进行排序,但它与接受的答案相同。

Gerard ONeill answered 2019-07-08T16:40:18Z

7 votes

联合查询只能有一个主文件union_sort,IIRC。 为了得到这个,在构成更大的UNION查询的每个查询中,添加一个字段,该字段将是您为UNION的ORDER BY排序的一个字段。

例如,你可能有类似的东西

SELECT field1, field2, '1' AS union_sort

UNION SELECT field1, field2, '2' AS union_sort

UNION SELECT field1, field2, '3' AS union_sort

ORDER BY union_sort

union_sort字段可以是您可能想要排序的任何内容。 在这个例子中,它恰好放在第一个表的第一个表,第二个表的第二个等的结果。

user151841 answered 2019-07-08T16:40:58Z

4 votes

我得到了这个加入加联盟的工作。

(SELECT

table1.column1,

table1.column2,

foo1.column4

FROM table1, table2, foo1, table5

WHERE table5.somerecord = table1.column1

ORDER BY table1.column1 ASC, table1.column2 DESC

)

UNION

(SELECT

... Another complex query as above

)

ORDER BY column1 DESC, column2 ASC

Robert Saylor answered 2019-07-08T16:41:27Z

0 votes

尝试:

SELECT result.*

FROM (

[QUERY 1]

UNION

[QUERY 2]

) result

ORDER BY result.id

其中[QUERY 1]和[QUERY 2]是您想要合并的两个查询。

André Hoffmann answered 2019-07-08T16:42:03Z

0 votes

这是因为你要对整个结果集进行排序,你应该对联合的每个部分进行单独排序,或者你可以使用ORDER BY(Something ie.subquery distance)THEN(something ie row id)子句

canni answered 2019-07-08T16:42:31Z

0 votes

我尝试在联合之前将订单添加到每个查询中

(select * from table where distance=0 order by add_date)

union

(select * from table where distance>0 and distance<=5 order by add_date)

但它似乎没有用。 它实际上并没有在每个选择的行中进行排序。

我认为你需要在外面保留订单,并将where子句中的列添加到订单中,例如

(select * from table where distance=0)

union

(select * from table where distance>0 and distance<=5)

order by distance, add_date

这可能有点棘手,因为你想按范围分组,但我认为它应该是可行的。

Mike C answered 2019-07-08T16:43:23Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值