我使用了一个名为“containsAll()”的 Java 方法来检查 ArrayList 是否具有共同的内容。
假设我在 MySQL 表中有一个列表 A(一行)和其他几个列表(在“名称”列中,逐行)。 所有列表都由逗号分隔的字符串组成(列表中至少有一个字符串)- 名称或其他内容。
现在,我想检查是否可以在“名称”列的任何行中找到列表 A 中的所有字符串。 结果集应显示“名称”中匹配的所有行,包括行/列表必须包含列表 A 中的所有字符串,并且可以包含其他字符串。
例子一
A:'T 先生'
____name_________________________________________
'Hannibal'
'Hannibal','Face','Murdock','Mr.T','Donald Duck'
'Face','Donald Duck'
'Superman','Chuck Norris','Mr.T'
_________________________________________________
结果集:'Hannibal','Face','Murdock','Mr.T','Donald Duck' -AND- “超人”、“查克·诺里斯”、“Mr.T”
例子二
A:“洛基”、“T 先生”、“ Apollo ”
______name__________________________________________________
'Hannibal','Face','Murdock','Donald Duck','Superman','Mr.T'
'Rocky','Apollo','Ivan'
'Apollo', 'Superman','Hannibal','Rocky','Mr.T','Chuck Norris'
'Rocky','Mr.T','Apollo','Chuck Norris'
_____________________________________________________________
结果集:'Apollo'、'Superman'、'Hannibal'、'Rocky'、'Mr.T'、'Chuck Norris' -AND- “洛基”、“T 先生”、“ Apollo ”、“库克诺里斯”
我想知道是否可以使用 MySQL 查询来执行这些结果。 提前谢谢你。
最佳答案
看起来你想做一个数组交集,除了你的数组是单列。可以做到,但会很慢,难以调试,并且无法利用关系数据库的强大功能。更好的方法是将表架构更改为如下所示:
表格组
group_id int unsigned not null auto_increment primary key,
character_list text
表members_in_group
group_id int unsigned not null,
group_member varchar(45) not null
然后你可以这样查询:
SELECT group_id, character_list
FROM groups g
JOIN members_in_groups m USING (group_id)
WHERE m.group_member IN ('Mr. T', ...);
groups
表可能与您当前的表非常相似。 members_in_groups
表是将相同的数据分割成易于搜索的部分。
根据您的评论,预计到达时间如果您可以保证每个 character_list
仅包含每个字符的 一个 实例:
SELECT group_id,
SUM(CASE m.group_member IN ('Mr. T', 'Apollo', 'Rocky') THEN 1 ELSE 0 END) AS tally,
character_list
FROM groups g
JOIN members_in_groups m ON (g.group_id=m.group_id)
GROUP BY group_id
HAVING SUM(CASE m.group_member IN ('Mr. T', 'Apollo', 'Rocky') THEN 1 ELSE 0 END) = 3;
在这种情况下,HAVING
子句必须等于 3,因为 IN ('Mr. T', 'Apollo', 'Rocky')
中有 3 个成员。
关于mysql - 如何使用 MySQL 比较两个以逗号分隔的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935750/