按标签匹配频率的顺序显示结果

时间:2013-05-02 07:06:24

标签: php sql

我编写了一个使用代码搜索广告的代码。代码分隔(空格)用户输入的搜索字符串,并使用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>' ;


}

2 个答案:

答案 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)。