所以我使用PHP / MYSQL和Ajax为我的搜索引擎创建了类似于Google的自动提示。如果我的MySQL有2个不同的同名标题,我怎么才能让它们中的一个出现在autosuggest上?例如:我有一个title = ufc 131的字段和另一个title = ufc 131的字段。当我搜索UFC 131时,我怎么只得到其中一个来显示?
我使用的代码是..
<?php
include('conn.php');
$str = strtolower($_GET['content']);
if(strlen($str))
{
$sel = mysql_query("select * from Streams where title like '".trim($str)."%'");
if(mysql_num_rows($sel))
{
echo "<table border =\"0\" width=\"100%\">\n";
if(mysql_num_rows($sel))
{
echo "<script language=\"javascript\">box('1');</script>";
while($row = mysql_fetch_array($sel))
{
$country = str_ireplace($str,"<b>".$str."</b>",($row['title']));
echo "<tr id=\"word".$row['title']."\" onmouseover=\"highlight(1,'".$row['title']."');\" onmouseout=\"highlight(0,'".$row['title']."');\" onClick=\"display('".$row['title']."');\" >\n<td>".$country."</td>\n</tr>\n";
}
}
echo "</table>";
}
}
else
{
echo "<script language=\"javascript\">box('0');</script>";
}
?>
答案 0 :(得分:0)
那么,你可以使用DISTINCT函数,你可以使用GROUP BY函数,或者甚至可以在从MySQL获取它然后使用array_unique()函数过滤后将所有搜索结果放在PHP中的数组中重复。
但是这一切都不如确保数据库不包含任何重复项有效。我的意思是,由于您提供了一个建议,您希望'SELECT'元素尽可能快地运行 。任何类型的技巧,如我上面列出的那些,都需要更多时间,更多内存和更多CPU的组合。因此,您要做的是确保数据库处于良好状态,以便SELECT语句尽可能顺利。执行此操作的一种好方法是使“Streams”表中的“title”字段成为UNIQUE索引。但是,我个人拥有的是我的“建议字段”中的FULLTEXT索引。 UNIQUE索引将确保数据库中不会有任何重复项,但是所有这一切都可以让您轻松获得插入的PHP代码。如果使用正确的FULLTEXT搜索,则可以进行FULLTEXT搜索(MATCH()AGAINST())。由于这些搜索使用索引,因此执行速度更快。您的查询语句将没有任何类型的索引实际使用索引。
最重要的是,你可能还想更新你的PHP(/ echo)代码,原因是,虽然你的代码很小,但它没有最佳编写(这也是你想要确定的东西,在搜索建议的情况下)。
答案 1 :(得分:0)
您的代码需要进行修改。 自动提示的一个好方法是使用尽可能少的数据。 因此,在这种情况下,您可以使用JSON。
include('conn.php');
$str = strtolower($_GET['content']);
$str = mysql_real_escape_string($str); // escape to prevent sql injection
现在查询,您可以在mysql中使用GROUP BY关键字来重复行
$sel = "SELECT title FROM Streams
WHERE title LIKE '{$str}%'
GROUP BY title
LIMIT 10";
现在,对于返回的数据,您可以使用Javascript对象表示法JSON
返回它$data = "{";
while($row = mysql_fetch_array($sel)) {
$data .= '"title":"'.$row['title'].'",';
}
$data .= "}";
现在您可以回复内容
echo $data;
在您的javascript中,您可以使用Jquery之类的库来轻松检索轻量级json数据
我希望这可以帮助你制作一个非常好的自动提示盒