簡體   English   中英

使用LIKE子查詢的SQL查詢

[英]SQL query with LIKE subquery

我有一個名為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但是在它們上沒有任何進展。

我堅決地強烈同意,正確的解決方案是一個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;

如果可能,您應該更改數據庫架構。 通常,將逗號分隔的列表存儲在關系數據庫中不是很好。

但是,如果這不是一個選擇,請嘗試使用join如下操作:

select g.GroupID 
from Groups g 
    join UserRecord ur on ';' || g.groupmembers like '%;' || ur.mqid || ';%'
where md5(ur.UID) = ' \*md5 checksum*\ '

我確實認為數據庫實際上應該進行重組,但這已經說過了。

對於您而言,我認為以下內容最接近您的查詢,可以解決您所相信的問題:

SELECT g.GroupID FROM Groups g 
WHERE g.GroupMembers LIKE '%;' || (SELECT UID FROM UserRecord ur WHERE md5(ur.UID) = ' \*md5 checksum*\ ') || ';%'
OR g.GroupMembers LIKE (SELECT UID FROM UserRecord ur WHERE md5(ur.UID) = ' \*md5 checksum*\ ') || ';%'

你的語句檢查是否一個ID字符串中的某處,因此,如果您正在尋找ID 2,你還會發現有成員像1 2,2 3,2222等。經過這樣的修改,你只能找到有組;ID; 或以ID開頭; 以便僅找到完整的ID匹配項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM