Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对逗号分隔文本字段的SQL查询_Mysql_Sql - Fatal编程技术网

Mysql 对逗号分隔文本字段的SQL查询

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

我很抱歉标题不完整-我也需要一个正确方向的观点。 我正在尝试编写一个查询,用于搜索包含逗号分隔文本字段中字符串的记录。我使用MySql和php

记录示例:

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,…”