我有一个名为Groups
的表,如下所示。
+---------+--------------------------------+
| GroupID | GroupMembers |
+---------+--------------------------------+
| 1 | 2342342;234234;234235;3533453; |
+---------+--------------------------------+
| 2 | 345345345;345345353;345335334; |
+---------+--------------------------------+
GroupMembers
字段是由分号分隔的UserID列表。
我有另一个名为UserRecord
的表,它将UserID与其他详细信息一起存储。
我需要一个SQL查询,它将获取UserID的md5校验和并找到它所在的组。
我尝试过以下语句,该语句只返回所有GroupID的列表,而不仅仅是用户所在的组。
SELECT g.GroupID FROM Groups g WHERE g.GroupMembers LIKE '%' || (SELECT UID FROM UserRecord ur WHERE md5(ur.UID) = ' \*md5 checksum*\ ') || '%'
我也摆弄了INNER JOIN
和WHERE EXISTS
,但没有取得进展。
答案 0 :(得分:1)
我非常强烈地强烈同意正确的解决方案是一个GroupMembers
表,每个组有一行,该成员也在该组中。我也生活在现实世界中,因此我们知道我们有时会遇到其他人糟糕的设计决策(或者,或许,决策决定很好......出于其他目的)。
MySQL中用于表达这一点的正确语法是:
select g.GroupID
from Groups g join
UserRecord ur
on concat(';', g.groupmembers) like concat('%;', ur.mqid, ';%')
where md5(ur.UID) = ' \*md5 checksum*\ ';
默认情况下,在MySQL中,||
运算符是逻辑OR
。它只是测试相邻的值是否为0。
您还可以将on
条件表达为:
on find_in_set(ur.mqid, replace(g.groupmember, ';', ',')) > 0;
答案 1 :(得分:0)
如果可能,您应该更改数据库架构。通常,将逗号分隔的列表存储在关系数据库中并不好。
但是,如果这不是一个选项,请尝试使用join
:
select g.GroupID
from Groups g
join UserRecord ur on ';' || g.groupmembers like '%;' || ur.mqid || ';%'
where md5(ur.UID) = ' \*md5 checksum*\ '
答案 2 :(得分:0)
我认为数据库实际上应该重组,但是已经说过了。
在您的情况下,我相信以下内容最接近您的查询,我相信会解决您的问题:
list
您的语句会检查字符串中某处是否存在ID,因此,如果您要查找ID 2,您还会找到包含1 2 , 2 < strong> 3, 2222 等。通过此修改,您只能找到具有ID的组;或以ID开头;这样只会找到完整的ID匹配。