Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.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
Php 如何在mysql中搜索逗号分隔的多个值_Php_Mysql - Fatal编程技术网

Php 如何在mysql中搜索逗号分隔的多个值

Php 如何在mysql中搜索逗号分隔的多个值,php,mysql,Php,Mysql,如何搜索由逗号分隔的多个值 例: 表名:searchTest id name keyword 1 trophy1 test1,test2,test3 2 trophy2 test2,test5 要点: 如果我搜索test2,结果Tropy1和Tropy2都应该显示出来 如果我搜索trophy1,那么trophy1应该是结果 如何解决这个问题 提前感谢您可以使用like select * from searchTest where keyword li

如何搜索由逗号分隔的多个值

例:

表名:searchTest

id    name      keyword

1     trophy1   test1,test2,test3

2     trophy2   test2,test5
要点:

  • 如果我搜索test2,结果Tropy1和Tropy2都应该显示出来

  • 如果我搜索trophy1,那么trophy1应该是结果

  • 如何解决这个问题

    提前感谢

    您可以使用like

    select * from searchTest where keyword like '%test2%'
    

    其中%是通配符。

    这些关键字必须存储在单独的表中

    我想说的是,在这里,您的数据结构非常不正确

    更好的解决方案是不使用逗号分隔格式在一个字段中存储多个值,而是使用三个表,定义如下:

    • searchtest
      • id
      • name
    • 关键字
      • id
      • word
    • keywords\u searchtest
      • id\u关键字
      • id\u searchtest

    这样,在
    searchtest
    中搜索具有特定关键字的条目将非常简单:

    select searchtest.*, keywords.*
    from searchtest
        inner join keywords_searchtest on keywords_searchtest.id_searchtest = searchtest.id
        inner join keywords on keywords.id = keywords_searchtest.id_keyword
    where keywords.word = 'test2'
    

    此外,您还必须搜索具有特定名称的searchtest条目:

    select *
    from searchtest
    where name = 'trophy1'
    
    关于第1点: 从searchTest中选择*关键字,如“%test2%

    关于第2点: 从searchTest中选择*,其中名称类似“trophy1%

    select * from searchTest where keyword  LIKE 'test2' or LIKE '%,test2' or LIKE 'test2,%'
    
    我已经使用上面的查询完成了这项工作,使用MySQL字符串函数,如下所示:

    SELECT * FROM searchTest WHERE FIND_IN_SET('test2', keyword) > 0
    

    由于这最终将是一个由某些输入驱动的搜索,第一个查询可以通过使用OR子句来完成两个搜索,添加(不针对编码语言进行调整):keyword=var或searchtest.name=vari agree with Etherton。马丁:你能解释一下两个问题的必要性吗?@Fero:我实际上同意@Joel,至少在大多数情况下是这样;唯一需要两个查询的情况是,如果一个名称没有任何关键字:在这种情况下,内部连接将失败,并且不返回任何行(未测试,但这是应该发生的情况)。哦,这很正确。我没想到。感谢您的回复请注意:这将匹配一行,其中包含
    test1、blahtest2glop、test3等内容;;;i、 它不仅匹配完整的标签,还匹配部分标签。你说的分数是什么意思:1。。2.您需要一个查询来处理这两种类型的答案,还是一次两个不同的答案。如果需要在同一个查询中处理两个“点”,您是否考虑过以不同的方式存储数据?我想您可能想在第一个
    片段中添加“%”,如“test2”
    片段。可能类似“%”、test2、%%或类似“%”、test2”或类似“test2、%”