4

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

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

现在,我想检查是否可以在“名称”列的任何行中找到列表 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-'Superman',Chuck Norris','Mr.T'


例二

答:“洛基”、“T先生”、“阿波罗”

 ______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- 'Rocky'、'Mr.T'、'Apollo'、'Cuck Norris'

我想知道是否可以使用 MySQL 查询来执行这些结果。先感谢您。

4

3 回答 3

4

看来您想做一个数组交集,除了您的数组是单列。可以做到,但速度很慢,难以调试,并且无法利用关系数据库的强大功能。更好的方法是将您的表模式更改为如下所示:

表组

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', ...);

The groups table is probably very like your current table. The members_in_groups table is the same data chopped up into easily searchable parts.

ETA given your comment, this should work if you can guarantee that each character_list contains only one instance of each character:

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;

In this case the HAVING clause must equal 3 because there are 3 members in IN ('Mr. T', 'Apollo', 'Rocky').

于 2012-08-13T14:15:45.623 回答
2

I solved this issue by using the REGEXP function in MySQL:

SELECT * FROM `table` WHERE `column` REGEXP("(value1|value2|value3)");
于 2019-11-13T10:28:52.290 回答
-3

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

于 2012-08-13T13:58:19.123 回答