Mysql 对逗号分隔文本字段的SQL查询
我很抱歉标题不完整-我也需要一个正确方向的观点。 我正在尝试编写一个查询,用于搜索包含逗号分隔文本字段中字符串的记录。我使用MySql和php 记录示例:Mysql 对逗号分隔文本字段的SQL查询,mysql,sql,Mysql,Sql,我很抱歉标题不完整-我也需要一个正确方向的观点。 我正在尝试编写一个查询,用于搜索包含逗号分隔文本字段中字符串的记录。我使用MySql和php 记录示例: recordID | statuses[TEXT] 1010 | 102 1011 | 100,103 1012 | 100,106,201,300 我从另一个表Status\u数据集中查询要搜索的雕像 statusName | statusCode | Yes/No name1 | 100
recordID | statuses[TEXT]
1010 | 102
1011 | 100,103
1012 | 100,106,201,300
我从另一个表Status\u数据集中查询要搜索的雕像
statusName | statusCode | Yes/No
name1 | 100 |
name2 | 101 |
name3 | 102 | Yes
name3 | 103 |
name4 | 106 | Yes
现在我想找到所有包含102号或106号雕像的记录
我可以分两步解决这个问题
查询status\u数据集中我想要的,然后连接条件部分,这样我基本上可以得到下一个查询:
SELECT * FROM table AS t
WHERE t.statuses LIKE '%201%'
OR t.statuses LIKE '%206%'
还是这个
SELECT * FROM table AS t
WHERE FIND_IN_SET('201',t.statuses)
OR FIND_IN_SET('206',t.statuses)
我会得到我想要的结果:
recordID | statuses
1010 | 102
1012 | 100,106,201,300
现在我想知道是否有更好的方法来解决这个问题。最好在一个查询中。
或者在两个查询中创建一个要搜索的值列表。
我查看了FIND_IN_SET(str,strlist)函数,但问题是我需要多个str。
是否有一个函数我可以使用,以便我可以填写多个我想搜索的值?
我一直在谷歌上搜索,但恐怕我不知道该怎么问 我认为您最好规范化您的DB模式(如果还不太晚),并存储像
ID、recordID、status这样的行,一行对应一个recordID状态关系。这将允许您通过简单(且更有效)的WHERE status in(X,Y,Z)
子句过滤您的状态。不要忘记索引recordID
和status
字段
通过一次性脚本运行,将当前数据集转换为规范化状态应该非常简单。尝试使用GROUP\u CONCAT()函数
SELECT recordID ,
GROUP_CONCAT(statuses)
FROM MyTable
GROUP BY recordID ;
我刚刚又读了你的帖子,你说“或”不是“和”。以下查询将查找您正在查找的记录:
select distinct r.*
from records r join
statuses_dataset d
on concat(',', r.statuses, ',') like concat('%,', d.status, ',%') and
d.use = 'Yes'
我将like更改为在statuses字符串前后包含逗号。这允许查询搜索“105”,而不是“105”,以防止匹配“1050”等等
如果您改变主意,想要拥有所有状态的记录,那么查询会稍微复杂一些。在这里,子查询matches首先查找代码上有任何匹配项的所有记录。然后,它统计匹配数并返回与所有单个代码匹配的记录
with matches as (select r.RecordId, count(distinct d.statuscode) as num_matches
from records r join
statuses_dataset d
on concat(',', r.statuses, ',') like concat('%,', d.status, ',%') and
d.use = 'Yes'
group by r.RecordId
)
select r.*
from records r cross join
(select count(distinct d.statuscode) as numyes
from statuses_dataset
where d.use = 'Yes'
) ssum join
matches m
on r.RecordId = m.Recordid and
m.nummatches = ssum.numyes
使用count distinct而不是count(*)只处理Status表中的重复项。我不确定是否理解正确。您建议我在myTable中添加带有雕像的字段吗?还是创造一种关系?我不是myTable的管理员-我只能从中进行选择查询。Statuses表有大约400行(实际上是对MyTable执行的400个违规测试),我认为向MyTable添加另一个字段并不是一个真正的选项,因为它已经有41个字段(这是尽可能细分的),谢谢您的回答。我必须承认我需要一些时间来测试它。如果我明白了,您建议我使用Gordon Linoff的concat?在myTable中的Status字段中的所有值上创建一个连接,以连接到表_Status。谢谢。我试过了,效果很好。Bagon Igoryo首先不应该存储逗号分隔的列表。@p.cambpbell我从Gordon Linoff那里得到了答案,但我很好奇如何使用GROUP_CONCAT()?据我所知,它会给出我正在搜索的所有值,并连接在一起“xx,xy,yy,…”