mysql - 如何使用 MySQL 比较两个以逗号分隔的字符串列表

标签 mysql list

我使用了一个名为“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/

相关文章:

list - 如何动态地将数据添加到这样的列表中 [Dart]

带有 json 收集数据的 PHP 页面在 ubuntu 上不起作用,在 Windows 服务器上也能同样工作

php - 如何记录/查明哪个 PHP 脚本使用了大量内存?优化问题

python - 在 python 3.x 中创建给定列表的所有子集的列表

android - 相同数据具有不同 expandableList 的多个 fragment

python - 从列表中选择最接近的对

c# - 以键和值作为类类型并使用键和索引访问值的数据结构

mysql - 删除重复行,同时对另一行进行分组

mysql - MySQL 中是否有一个函数不允许在已经从数据库中的 ENUM 数据类型中选择一个值之后直接选择一个值?

java - 如何从java向mysql插入自动增量值