Mysql 编写状态1的选择第一条记录的查询(&A);状态2的第二条记录,依此类推

Mysql 编写状态1的选择第一条记录的查询(&A);状态2的第二条记录,依此类推,mysql,Mysql,我想写一个查询,选择状态1的第一条记录和状态2的第二条记录,依此类推 我喜欢桌子 +----+--------+--------+ | id | name | status | +----+--------+--------+ | 1 | ABC | 1 | | 2 | PQR | 1 | | 3 | qqq | 2 | | 4 | www | 1 | | 5 | eee | 2 | | 6 |

我想写一个查询,选择状态1的第一条记录和状态2的第二条记录,依此类推

我喜欢桌子

+----+--------+--------+
| id |   name | status |
+----+--------+--------+
|  1 |   ABC  |      1 |
|  2 |   PQR  |      1 |
|  3 |   qqq  |      2 |
|  4 |   www  |      1 |
|  5 |   eee  |      2 |
|  6 |   rrr  |      2 |
|  7 |   ttt  |      2 |
+----+--------+--------+
我需要像下面这样的输出

+----+-------+---------+
| id |  name |  status |
+----+-------+---------+
|  1 |   ABC |       1 |
|  3 |   qqq |       2 |
|  2 |   PQR |       1 |
|  5 |   eee |       2 |
|  4 |   www |       1 |
|  6 |   rrr |       2 |
|  7 |   ttt |       2 |
+----+-------+---------+
记录的顺序应该是这样的

- 1st record with status 1
- 2nd record with status 2
- 3rd record with status 1
- 4th record with status 2
- 5th record with status 1
- 6th record with status 2
  • 第7条状态为2的记录->如果我们没有找到任何状态为1的记录,则选择状态为2的记录,反之亦然

我通过编码获得了这个输出,但MySQL query也可以获得这样的输出

您可以使用变量:

SELECT id, name, status
FROM (
   SELECT id, name, status,
       @grp := IF(@status = status, @grp + 1, 
                  IF(@status := status, 1, 1)) AS grp
   FROM mytable
   CROSS JOIN (SELECT @grp := 0, @status := 0) AS vars
   ORDER BY status, name) AS t
ORDER BY grp, status, name   
所用算法中的关键是变量
@grp
:它基本上模拟了(按状态分区)上的
行数()。使用
@grp
我们可以通过交替
状态
效果轻松实现订单


您可以使用此查询
通过rownum have mod(rownum,2)=0从表组中选择rownum

您可以详细说明您希望输出的顺序吗。@raushankumar这不是重复的问题。您正在引用偶数/奇数记录。出于某些不清楚的原因,至少我不清楚,rextester不能很好地处理MySQL变量。事实上,Upvote,rextester确实可以工作,
@status=0
应该是
@status:=0
,请参阅。@Forward Good catch!我已经在我的帖子中添加了rextester演示。@Giorgos Betsos感谢它按照我的要求提供了记录。MySQL中没有rownum。感谢您提供此代码片段,它可能会提供一些即时帮助。通过说明为什么这是一个很好的解决问题的方法,正确地解释它的教育价值,并将使它对未来有类似但不完全相同问题的读者更有用。请在回答中添加解释,并说明适用的限制和假设。
SET @row:=0;
SET @row2:=0;

(SELECT @row:=@row+1, id, `name`, status FROM mytable WHERE status = 1)
UNION
(SELECT @row2:=@row2+1, id, `name`, status FROM mytable WHERE status = 2)
ORDER BY 1, 4;