使用LIKE子查询的SQL查询

时间:2016-07-07 00:04:32

标签: mysql sql sql-like

我有一个名为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 JOINWHERE EXISTS,但没有取得进展。

3 个答案:

答案 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 3, 2222 等。通过此修改,您只能找到具有ID的组;或以ID开头;这样只会找到完整的ID匹配。