2012-08-13 83 views
2

我使用名为'containsAll()'的Java方法来检查ArrayLists是否具有公共内容。如何使用MySQL比较两个以逗号分隔的字符串列表

比方说,我有一个列表A(一行),和一个MySQL表(列'名称',逐行)中的几个其他列表。 所有列表都由逗号分隔的字符串(至少一个列表中的一个字符串) - 名称或其他组成。

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

例I

一个: 'Mr.T'

____name_________________________________________ 
'Hannibal' 
'Hannibal','Face','Murdock','Mr.T','Donald Duck' 
'Face','Donald Duck' 
'Superman','Chuck Norris','Mr.T' 
_________________________________________________ 

结果集: '汉尼拔', '脸', 'Murdock的', 'Mr.T', '唐老鸭' - AND- '超人',查诺里斯, 'Mr.T'


例II

一个: '洛奇', 'Mr.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' 
_____________________________________________________________ 

结果集: '阿波罗', '超人', '汉尼拔', '洛奇', 'Mr.T', '查克·诺里斯' -AND- '洛奇', 'Mr.T', 'Apollo','Cuck Norris'

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

+2

看起来像DB中的多值字段 - 这通常是设计不好的警告信号。 – Romain 2012-08-13 14:08:44

+0

是不是有一个原因,你没有使用表来存储字符名称值和另一个表来存储任何表存储这些列表和包含字符名称的表之间的关系?这种关系有一个名字 - 许多人都是这样 - 在RDBMS中建模并不困难。 – 2012-08-13 14:11:24

+0

我正在开发一个小应用程序。那么,在客户端,最终用户能够与界面进行交互,因此在飞行中选择了一个字符串列表。在服务器端,这些字符串列表将与我的MySQL数据库的内容进行比较。我已经有了一个可以工作的DB设计方案。我仅使用Java和外部平面文件进行了列表之间的比较。但它太慢了...... – 2012-08-13 16:37:32

回答

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给出您的意见,这应该工作如果你能保证每个​​只包含每个字符的一个例如:

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,因为有3名成员在IN ('Mr. T', 'Apollo', 'Rocky')

+0

对,我有类似的东西。我正在检查你的方法... – 2012-08-13 16:46:57

+0

Thx,我测试了它。这不正是我一直在寻找的东西。我需要类似于“SELECT * FROM table WHERE FIND_IN_SET('Mr.T',column_name)”的东西,但是第一个参数在某些情况下必须是“... FIND_IN_SET('T','Apollo', '洛奇', '列名')”。 – 2012-08-15 20:03:27

+0

@myX:我已经扩展了我的答案以涵盖集合中多个名称的情况。 – dnagirl 2012-08-16 00:34:59

-2

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

+4

当他在包含'Z,X和Y'的行中查找'X,Y和Z'时会发生什么? – dnagirl 2012-08-13 14:16:59

相关问题