按日期排序 UNION ALL 上的选择查询
Posted
技术标签:
【中文标题】按日期排序 UNION ALL 上的选择查询【英文标题】:Order by date a select query on UNION ALL 【发布时间】:2013-10-13 20:56:02 【问题描述】:我的 mysql 查询没有什么问题: 我有两张桌子:
表格时间线
id | date | text
1 2013-10-13 Hello
表代表
id | date | text
1 2013-10-12 Its me again
1 2013-10-11 What?
1 2013-10-10 Lorem ipsum
我正在做的是UNION ALL
时间线和代表。第一行应始终是时间线中的行(始终是一行),然后是代表表中的所有行,但按DESC
顺序。
我的查询是以下一个(除了 order by 之外其他都可以)
select id,date,text from timeline UNION ALL select * from reps order by date desc
想像评论(位于顶部)这样的评论,按 desc 顺序回复评论,最新的在前。
提前谢谢你。
【问题讨论】:
【参考方案1】:将 UNION 放在子查询中:
SELECT id, date, text
FROM (SELECT id, date, text, 1 AS priority
FROM timeline
UNION ALL
SELECT *, 2 AS priority
FROM reps) u
ORDER BY priority, date DESC
【讨论】:
你必须先按id订购 @Jonysuise 嗯?为什么会这样? 我在问题中没有看到任何提及。他说时间线只有一排。我怀疑他的实际查询在两个子查询中都有where id = ...
,所以他没有显示所有 ID。
假设reps表的id是timelines表的id的fk...:(
工作就像魅力!也感谢所有其他人!【参考方案2】:
您的查询是正确的,您只需像这样通过 () 关闭第二个查询:它只会订购第二个查询。没有 () 它将对两个查询进行排序。
select id,date,text from timeline
UNION all
(select * from reps order by date desc)
【讨论】:
不是我的反对意见,但UNION ALL
会保证左侧的结果先于右侧的所有结果吗?
@JoachimIsaksson 如果您先选择它,那么它首先出现。【参考方案3】:
根据日期值创建一个 Unix_timestamp 并按其值排序。
SELECT -1 as 'id' , 99999999999999 as 'sortalias' , now() as 'datum||date'
UNION
( SELECT
id
,unix_timestamp(datum) as 'sortalias'
,datum as 'datum||date'
FROM kunde
)
order by sortalias desc
【讨论】:
【参考方案4】:select id,date,text from (
select id,1 poid,date,text
from timeline
union all
select id,2 poid,date,text
from reps
) t
order by t.id asc,t.poid asc,t.date desc
【讨论】:
以上是关于按日期排序 UNION ALL 上的选择查询的主要内容,如果未能解决你的问题,请参考以下文章
mysql数据库多个表union all查询并排序的结果为啥错误
UNION ALL、TEXT 字段和 ORDER BY 错误