如何返回数组中所有值都存在的行

时间:2014-07-28 10:43:56

标签: php mysql

我有一个数据库,其中的值存储如下:

Id                 Description
 1                  one,two,three,four,five
 2                  four,three,two
 3                  five,one

我也有来自用户的动态数组:

1) $arr = array("five","one");

所以我必须选择id = 1和id = 3的描述,因为它们的描述包含这些词。

另一个例子

2) $arr = array("two","three");

所以我必须选择id = 1和id = 2的描述,因为它们的描述包含这些词。

那么如何执行该查询? 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试全文搜索:

喜欢

string str = string.Join(" +", $arr);
str = str.Replace("'","''");

string strSQL = @"SELECT * FROM 
your_table WHERE 
MATCH ( Description) 
AGAINST ('" + str + "' IN BOOLEAN MODE);"

结果是:

 $sql = mysql_query("SELECT * FROM 
                     your_table WHERE 
                     MATCH ( Description) 
                     AGAINST ('+one +five' IN BOOLEAN MODE);");

确保从mysql配置文件中删除所有停用词。

至于加号:

第一个sql示例

SELECT * FROM your_table 
          WHERE match(Description) against('+one +five' IN BOOLEAN MODE) LIMIT 10";

结果:包含单词' one'和'五'

第二个sql示例

SELECT * FROM your_table 
           WHERE match(Description) against('+one five' IN BOOLEAN MODE) LIMIT 10";

结果:包含“' one”字样,但如果它们还包含“'

,则排名更高

第三个sql示例

SELECT * FROM your_table 
           WHERE match(Description) against('one five' IN BOOLEAN MODE) LIMIT 10";

结果:包含单词' one'或者'五'

答案 1 :(得分:1)

禁止全文搜索或正确规范数据(例如don't use comma delimited data if you must search through it),然后您可以使用FIND_IN_SET()搜索逗号分隔的字符串。

但是,由于FIND_IN_SET()的第一个参数不接受以逗号分隔的列表,因此必须先将搜索词分开(请参阅PHP的explode)。

通过一些迭代,您可以创建如下查询:

SELECT * FROM your_table
WHERE FIND_IN_SET('five', description)
  AND FIND_IN_SET('one', description)

有时,当您动态创建此类查询时,可以更轻松地创建如下查询:

SELECT * FROM your_table
WHERE 1 = 1
/* Start dynamic portion */
  AND FIND_IN_SET('five', description)
  AND FIND_IN_SET('one', description)

或者,实际上,如果您正确使用PDO绑定参数:

SELECT * FROM your_table
WHERE 1 = 1
/* Start dynamic portion */
  AND FIND_IN_SET(?, description)
  AND FIND_IN_SET(?, description)

使用PHP的bindParam()绑定每个参数。

答案 2 :(得分:1)

我使用"喜欢"参数。请参阅以下代码

$count = 1;


 foreach($arr as $a){
            if($count == 1){
               $str ="`Description` LIKE '%$a%'";
            }
             else{
               $str.= "AND `Description` LIKE '%$a%'"; 
            }
            $count++;
        }
$query = Select `id` From `my_table` Where $str;

这不是最好的方法。但这给了我想要的结果