Mysql 编写状态1的选择第一条记录的查询(&A);状态2的第二条记录,依此类推
我想写一个查询,选择状态1的第一条记录和状态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 |
+----+--------+--------+
| 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;