我有 table :
+----+-------------------+
| id | channel |
+----+-------------------+
| m2 | AA-AA |
| 1 | KR_A 1 |
| 2 | KR_A 2 |
| 11 | HR_A 3 |
| 12 | HR_B 1 |
| m4 | BB-BB |
| m3 | CC-CC |
| 17 | SR_B 1 |
| m5 | DD-DD |
| m1 | EE-EE |
+----+-------------------+
当我添加m2
查询时需要返回:
1
2
11
12
所以我使用这个查询:
SET @showChannels:=0;
SELECT id, channel
FROM table
WHERE
(
@showChannels:=( (id like 'm%' and id = 'm2' and @showChannels) or (id not like 'm%' ) )
)
AND id not like 'm%';
正确返回高于预期的结果。
问题是当我添加 m3
来查询时我需要得到这个:
17
但我总是得到:
1
2
11
12
这是不正确的,因为我只需要获得 17 个值...可以帮助修改它以使其工作吗?今天尝试了4个小时,未能达到预期的效果。
最佳答案
只需进行最少的更改,您就可以向表中添加排序列,并将值更新为您想要反射(reflect)正确排序的值:
ALTER TABLE table ADD COLUMN sort_seq INTEGER;
UPDATE table SET sort_seq = 1 WHERE id = 'm2';
UPDATE table SET sort_seq = 2 WHERE id = '1';
UPDATE table SET sort_seq = 3 WHERE id = '2';
UPDATE table SET sort_seq = 4 WHERE id = '11';
UPDATE table SET sort_seq = 5 WHERE id = '12';
UPDATE table SET sort_seq = 6 WHERE id = 'm4';
UPDATE table SET sort_seq = 7 WHERE id = 'm3';
UPDATE table SET sort_seq = 8 WHERE id = '17';
UPDATE table SET sort_seq = 9 WHERE id = 'm5';
UPDATE table SET sort_seq = 10 WHERE id = 'm1';
但是,您遇到的核心问题是您需要反向引用某种“标记”。更好的方法是有一种方法对记录进行分组。您可以通过为记录添加组查找表来做到这一点:
+----+-------------------+--------+--------+
| id | channel | grp | sort |
+----+-------------------+--------+--------+
| m2 | AA-AA | m2 | 1 |
| 1 | KR_A 1 | m2 | 2 |
| 2 | KR_A 2 | m2 | 3 |
| 11 | HR_A 3 | m2 | 4 |
| 12 | HR_B 1 | m2 | 5 |
| m4 | BB-BB | m4 | 6 |
| m3 | CC-CC | m3 | 7 |
| 17 | SR_B 1 | m3 | 8 |
| m5 | DD-DD | m5 | 9 |
| m1 | EE-EE | m1 | 10 |
+----+-------------------+--------+--------+
+----+--------------------+--------+
| id | group_desc | sort |
+----+--------------------+--------+
| m1 | Description for m1 | 1 |
| m2 | Description for m2 | 2 |
| m3 | Description for m3 | 3 |
| m4 | Description for m4 | 4 |
| m5 | Description for m5 | 5 |
+----+--------------------+--------+
然后您可以在该表上JOIN
来仅选择属于您的组的项目和/或按该组进行排序。
SELECT c.id, c.channel
FROM channels c
JOIN channel_groups cg
ON cg.id = c.grp
AND c.id <> cg.id
WHERE cg.id = 'm2'
ORDER BY c.sort;
或者您可以使用类似的查询,但您可以使用 WHERE
子句将组 channel 标识为主 channel :
SELECT c.id, c.channel, CASE WHEN c.id = cg.id THEN 1 ELSE 0 END AS primary
FROM channels c
JOIN channel_group cg
ON cg.id = c.grp
ORDER BY c.sort;
关于MySQL 选择从 到 并显示不带标记的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56418608/