MySQL 选择从 到 并显示不带标记的结果

标签 mysql variables filter

我有 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/

相关文章:

javascript - 在 Javascript 中声明变量但不初始化它

PHP - MYSQL 不返回设置参数内的结果

mysql - 显式连接到隐式连接 SQL

mysql - 多表外连接问题

c# - 设置类型并返回不同类型的属性

Java - 方法中的变量在调用后未被删除

php - 如何在 Magento 管理网格中的自定义渲染器上创建 filter_condition_callback?

css - IE6 透明度问题

Django查询过滤器按ManyToMany对象的数量过滤

php - pdo 按相关性排序,然后按另一个字段排序