我有一个数据库,其中的值存储如下:
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的描述,因为它们的描述包含这些词。
那么如何执行该查询? 有人可以帮忙吗?
答案 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;
这不是最好的方法。但这给了我想要的结果