我编写了一个使用代码搜索广告的代码。代码分隔(空格)用户输入的搜索字符串,并使用LIKE子句将每个单词与数据库中的标记相对应,并用逗号分隔。我得到了正确的结果。但我想要的是匹配更多标签与搜索字符串单词的行应该出现在顶部。
例如: - 第1行(db)中的标签是“samung,mobile,phone”,第2行是“samsung,phone”,搜索字符串是“samsung mobile”,第1行应该出现首先,因为它有更多匹配然后第二行。我怎样才能使用ORDER BY。
我的代码是: -
<?php require_once("db_connect.php"); ?>
<form action="" method="POST">
<input type="text" name="searchtext" />
<input type="submit" name="submit" value="Search" />
</form>
<?php
if(isset($_POST["submit"]))
{
$searchquery = $_POST["searchtext"];
$searcharray = array();
$searcharray = explode(" ",$searchquery);
if(!isset($searcharray[1]))
$searcharray[1] = "XXXXXXXX";
if(!isset($searcharray[2]))
$searcharray[2] = "XXXXXXXX";
if(!isset($searcharray[2]))
$searcharray[2] = "XXXXXXXX";
if(!isset($searcharray[3]))
$searcharray[3] = "XXXXXXXX";
$query = "select * from search where tag LIKE '%$searcharray[0],%' OR tag LIKE '%$searcharray[1],%' OR tag LIKE '%$searcharray[2],%' OR tag LIKE '%$searcharray[3],%' ";
$result=mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo $row["name"]. '<br>' ;
}
答案 0 :(得分:2)
比较运算符返回0或1,具体取决于它们是否匹配,因此您可以添加它们来计算匹配数:
$searcharray = explode(" ",$searchquery);
$matchexpr = implode(' + ', array_map(function($x) { return "(find_in_set('$x', tag) > 0)";}, $searcharray));
$query = "select *,
($matchexpr) as matches
from search
having matches > 0
order by matches desc";
答案 1 :(得分:0)
逗号周围没有空格。
我更改了这一行: -
$matchexpr = implode(' + ', array_map(function($x) { return "find_in_set('$x', tag) > 0";}, $searcharray));
到
$matchexpr = implode(' OR ', array_map(function($x) { return "find_in_set('$x', tag) > 0";}, $searcharray));
正确获取行但订单不正确。它按原始顺序返回行,我认为它是因为OR不连接返回的值。
使用你的代码:_
&#34;三星手机&#34;单词返回2结果(viv和samsung psp)。 &#34;移动三星&#34;只返回1个结果(sony mobile)。