我很抱歉标题不完整 - 我也需要在这个问题上找到正确的方向。 我正在尝试编写一个查询来搜索包含逗号分隔文本字段中的字符串的记录。我使用MySql和php。
记录示例:
recordID | statuses[TEXT]
1010 | 102
1011 | 100,103
1012 | 100,106,201,300
我查询我要从另一个表statues_dataset
中搜索的雕像statusName | statusCode | Yes/No
name1 | 100 |
name2 | 101 |
name3 | 102 | Yes
name3 | 103 |
name4 | 106 | Yes
现在我想查找包含雕像102或106
的所有记录我可以分两步解决这个问题 查询statues_dataset我想要的,然后连接条件部分,所以我基本上得到下一个查询:
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。 有没有我可以使用的功能,所以我可以用我想要搜索的多个值填充它? 我一直在谷歌搜索,但我担心我不知道如何正确问。
答案 0 :(得分:2)
我刚刚再次阅读你的帖子,你说“或”不是“和”。以下查询查找您要查找的记录:
select distinct r.*
from records r join
statuses_dataset d
on concat(',', r.statuses, ',') like concat('%,', d.status, ',%') and
d.use = 'Yes'
我改变了类似的状态字符串之前和之后包含逗号。这允许查询搜索“,105”而不是“105”,以防止匹配“1050”等。
如果您改变主意并想要拥有所有状态的记录,那么查询会更复杂一些。这里,子查询匹配首先查找代码上任何匹配的所有记录。然后计算匹配数并返回与所有单个代码匹配的记录。
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(*)只处理状态表中的重复项。
答案 1 :(得分:0)
我认为你最好规范化你的数据库模式(当它还不太晚时),并存储像ID, recordID, status
这样的行,一行记录ID-状态关系。这将允许您通过简单(和更高效)WHERE status in (X, Y, Z)
子句过滤您的状态。不要忘记确实索引recordID
和status
字段。
通过一些一次性的脚本运行,将当前数据集转换为规范化状态应该非常简单。
答案 2 :(得分:0)
尝试使用GROUP_CONCAT()
功能
SELECT recordID ,
GROUP_CONCAT(statuses)
FROM MyTable
GROUP BY recordID ;