我使用了一个名为'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查询执行这些结果。 提前谢谢。
答案 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 \'%'