我有下表标签1
+------+------+
|app |val |
+------+------+
|1 |A |
+------+------+
|2 |B |
+------+------+
|2 |A |
+------+------+
|3 |B |
+------+------+
|1 |B |
+------+------+
|3 |A |
+------+------+
我需要MySQL查询,其结果如下表tab1
+------+------+
|1 |A |
+------+------+
|2 |B |
+------+------+
|3 |B |
+------+------+
|1 |B |
+------+------+
|2 |A |
+------+------+
|3 |A |
+------+------+
我需要MySQL查询,其结果如下表tab1
即,首先从列应用程序中选择1个不同的值,然后再选择其他不同的值集,依此类推
答案 0 :(得分:0)
您可以根据应用分配行号,然后订购
SELECT S.*
FROM
(
SELECT T.*,
IF (T.APP <> @P,@RN:=1,@RN:=@RN+1) RN,
@P:=T.APP P
FROM T
CROSS JOIN (SELECT @RN:=0,@P:=0) R
ORDER BY APP
) S
ORDER BY RN,APP;
结果
+------+------+------+------+
| app | val | RN | P |
+------+------+------+------+
| 1 | A | 1 | 1 |
| 2 | B | 1 | 2 |
| 3 | B | 1 | 3 |
| 1 | B | 2 | 1 |
| 2 | A | 2 | 2 |
| 3 | A | 2 | 3 |
+------+------+------+------+
6 rows in set (0.00 sec)
但是我不认为val始终是正确的val,因为数据没有以任何特定顺序存储,并且在提供所提供的样本数据的情况下,无法强制执行顺序。如果有一种方法可以在数据中建立顺序,例如auto_increment字段或时间戳,则应在解决方案中使用它。