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

时间:2012-08-13 13:55:08

标签: mysql list

我使用了一个名为'containsAll()'的Java方法来检查ArrayLists是否有共同的内容。

假设我有一个列表A(一行),以及MySQL表中的其他几个列表(列'name',逐行)。 所有列表都包含逗号分隔的字符串(列表中至少有一个字符串) - 名称或其他。

现在,我想检查是否可以在“name”列中的任何行中找到列表A中的所有字符串。 结果集应该显示“name”中匹配的所有行,包括行/列表必须包含列表A中的所有字符串,并且可以有其他字符串。

示例I

答:'Mr.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' - 和 -             '超人',查克诺里斯','先生''


示例II

答:'洛奇','先生','阿波罗'

 ______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','超人','Hannibal','Rocky','Mr.T','Chuck Norris' - 和 -              'Rocky','Mr.T','Apollo','Cuck Norris'

我想知道是否可以使用MySQL查询执行这些结果。 提前谢谢。

3 个答案:

答案 0 :(得分:3)

除了您的数组是单列之外,您似乎想要进行数组交集。它可以完成,但它会很慢,很难调试,也不会利用关系数据库的强大功能。更好的方法是将表模式更改为以下内容:

表组

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表格与切换成易于搜索的部分的数据相同。

ETA给出了您的评论,这应该有效如果您可以保证每个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个成员。

答案 1 :(得分:0)

我通过在MySQL中使用REGEXP函数解决了这个问题:

SELECT * FROM `table` WHERE `column` REGEXP("(value1|value2|value3)");

答案 2 :(得分:-2)

SELECT * FROM tbl_name WHERE field_name LIKE'%\'Mr.T \'%'