[英]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 JOIN
和WHERE 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.