我有一个问题,我不知道是否有任何方法可以仅借助 SQL 来解决它。
我有一张表 users
+----+------------+
| ID | group_id |
+----+------------+
| 1 | 1;2;3 |
+----+------------+
| 2 | 1;2;3;4 |
+-----------------+
| 3 | 1;2;3;6 |
+-----------------+
| 4 | 1;2;6 |
+-----------------+
我知道它不是正常形式,但我无法更改它,因为它已被客户使用。
所以问题不在于向用户显示我没有的组。
例如:如果我为 ID = 3 的用户进行选择。我需要显示用户 1、3 和 4,因为用户 ID = 3 包含用户 ID = 1 的所有组,但我不应该显示用户ID = 2.
我的同事帮我找到最好的解决方案,如果有人感兴趣的话:
SELECT *
FROM `users`
WHERE CONCAT('[',REPLACE('1;2;3;6', ';', ']['), ']') LIKE CONCAT('%[', REPLACE(group_id,';',']%['),']%')
最佳答案
MySQL 有一个用于此类用例的内置命令,find_in_set
。
不幸的是,它只适用于以逗号分隔的值,不适用于以分号分隔的值,但这也很容易克服:
SELECT *
FROM users
WHERE FIND_IN_SET('3', REPLACE(group_id,';',','))
关于mysql - 具有特殊修改的 SQL 选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378657/