是否可以在 SQL 中合并到 SELECT 中?

Posted

技术标签:

【中文标题】是否可以在 SQL 中合并到 SELECT 中?【英文标题】:Is it possible to merge in a SELECT in SQL? 【发布时间】:2012-01-12 09:18:50 【问题描述】:

假设我想从名为messages 的表中检索 100 条记录,我想通过以下方式获取它们:

1st message
100th message
2nd message
99th message
3rd message
98th message
(...)

有没有办法有效地做到这一点?什么是适当的查询? 或者我应该查询选择前 50 个,查询选择最后 50 个然后合并结果?

【问题讨论】:

这是一种情况,我可能会进行两个查询并将它们合并到应用程序代码中。它可能可以通过创建行号并使用非常聪明的条件ORDER BY 在一个查询中完成,但在应用程序代码中更容易完成。 是的,我也是这么想的......也许用两个不同的查询来做这件事并在代码中合并它们的结果会更容易/更有效 我肯定会等着看这里是否有人能提出一个巧妙的解决方案。这里有一些非常聪明的人。 你知道要提前检索多少条记录吗?总是 100 吗? 请包含 ORDER 逻辑,总是按 add_date desc 排序? 【参考方案1】:

试试你的 ID 是否是一串数字:

第一

SET @half = (SELECT MAX(id) FROM messages)/2;

然后

SELECT * FROM `messages` ORDER BY (IF(id<@half,@half*2-id,id-1)) DESC,id ASC;

【讨论】:

末尾的ASC,应该是DESC。除此之外,这非常有效,它是所有这些中最简单的解决方案。谢谢! 问的有点晚了...但是如果不是通过id 订购,而是通过timestamp 订购(使用UNIX_TIMESTAMP(timestamp))怎么办? 行不通,顺序是基于偶数和奇数的ID号,时间戳不是线性的以适应它...【参考方案2】:

重点是创建两个虚拟列“serie_order”(变体)和“serie”(常数),您将在数据的两个部分使用(您必须将数据分成两部分)。

SELECT * FROM (
  SELECT 1 as serie, message_id AS serie_order , *  FROM
   (SELECT message_id FROM messages ) as part_up
UNION 
  SELECT 2 as serie, 101-message_id  as serie_order, * FROM
   (SELECT message_id FROM messages) as part_down
) AS world

ORDER BY serie_order ASC, serie ASC
LIMIT 100

【讨论】:

遗憾的是 mysql 缺少 generate_series() 函数。 那只是用作虚拟数据,我使用 op "messages" 表编辑 这是正确的想法,但并不完全正确。裸“*”需要在 SELECT 中排在第一位,否则会出现语法错误。另外,如果“消息”有 200 行怎么办?顺便说一句,您不需要最内层的派生表,因为您可以简单地使用SELECT 1 AS serie, message_id AS serie_order, message_id FROM messages 你完全正确(我应该已经厌倦了写那个:p)SELECT * FROM(SELECT 1 as serie,message_id AS serie_order,* FROM messages) as part_up UNION SELECT 2 as serie , - message_id as serie_order, * FROM messages ) as part_down ) AS world ORDER BY serie_order ASC, serie ASC【参考方案3】:
set @rank:=0; 

select id from 
(select id, @rank:=(coalesce(@rank, 0)+1) as new_order 
 from a_table 
 order by some_column limit 100) as ordering
order by if (new_order<=50, new_order-1, abs(100-new_order)) asc;

【讨论】:

几乎! "new_order" 1 和 "new_order" 100 在你的 ORDER BY 子句中都变成了 0,而 2 和 99 变成了 1,等等。 MySQL 怎么知道先放哪条记录?您需要第二个 ORDER BY 条件,如this answer,以保证正确的输出。

以上是关于是否可以在 SQL 中合并到 SELECT 中?的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么合并表?

SQL怎么把两个表的数据合在一起查询!?

SQL SERVER 如何把1列多行数据 合并成一列显示,具体格式如下:

sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果

是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?

求助:SQLSERVER多条查询语句合并