0

我编写了一个代码来使用标签搜索广告。代码分隔(空格)用户输入的搜索字符串,并使用 LIKE 子句将每个单词与数据库中以逗号分隔的标签进行匹配。我得到了正确的结果。但我想要的是与搜索字符串单词匹配更多标签的行应该出现在顶部。

例如:- 第一行(在 db 中)的标签是“samung,mobile,phone”,第二行是“samsung,phone”,搜索字符串是“samsung mobile phone”,那么第一行应该首先出现有更多的比赛然后第二行。我如何使用 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>' ;


}
4

2 回答 2

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";
于 2013-05-02T07:12:35.373 回答
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 没有连接返回的值。

使用你的代码:_

“samsung mobile”一词返回 2 个结果(viv 和 samsung psp)。“mobile samsung”仅返回 1 个结果(sony mobile)。

于 2013-05-02T08:20:35.217 回答