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

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

假设我在MySQL表中有一个列表A(一行)和其他几个列表(在“名称”列中,逐行).

所有列表均由逗号分隔的字符串(列表中至少一个字符串)组成-名称或其他名称.

现在,我想检查列表A中的所有字符串是否都可以在“名称”列的任何行中找到.

结果集应显示“名称”中匹配的所有行,包括行/列表的行必须具有列表A中的所有字符串,并且可以具有其他字符串.

例子一

答:“ T先生”

____name_________________________________________

'Hannibal'

'Hannibal','Face','Murdock','Mr.T','Donald Duck'

'Face','Donald Duck'

'Superman','Chuck Norris','Mr.T'

_________________________________________________

结果集:“汉尼拔”,“脸部”,“默多克”,“ T先生”,“唐老鸭”-AND-

‘超人’,查克·诺里斯’,’T先生’

例二

答:“ Rocky”,“ Mr.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-

‘Rocky’,’T先生’,’Apollo’,’Cuck Norris’

我想知道是否可以使用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表是分割成易于搜索的部分的相同数据.

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中有3个成员(“ Mr. T”,“ Apollo”,“ Rocky”).

标签:mysql,list

来源: https://codeday.me/bug/20191011/1892301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值