在MySQL中搜索多个列以获取自动完成结果

时间:2013-06-12 03:03:02

标签: mysql database autocomplete multiple-columns

我正在使用以下代码和Jquery自动填充功能来填充我网站上的搜索建议..

$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);

$data = array();
if ( $results && mysql_num_rows($results) )
{
while( $row = mysql_fetch_array($results, MYSQL_ASSOC) )
{
    $data[] = array(
        'label' => $row['artist'],
        'value' => $row['artist']
    );
}
}

echo json_encode($data);
flush();

这工作正常,但我希望能够在多个列中搜索各种结果,例如 -

  • 来自艺术家

  • 的艺术家姓名
  • 来自名称

  • 的曲目名称
  • 标签

  • 的记录标签

我花了2个小时阅读大量不同的方法来完成它,但是没有一个方法适合我正在尝试做的事情,而且我无法正确格式化查询。

有人有任何建议吗?

- 以下编辑添加解决方案 -

这是我设法让它工作的原因,感谢Ed的建议以防其他人试图这样做。

这将从2个不同的表中搜索4个不同的列,并将用户键入的搜索词与在任何表中找到的任何内容匹配,同时删除重复的结果。这与JQuery Autocomplete完美配合,以及如何设置它。

1)创建以下php文件并将其命名为search.php

<?php
if ( !isset($_REQUEST['term']) )
exit;

$connect = mysql_connect('dbhost', 'dbusername', 'dbpassword') or die( mysql_error() );
mysql_select_db('dbname');

$results = mysql_query('SELECT artist AS shout FROM albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT name FROM albums WHERE name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT label FROM albums WHERE label LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT track_name FROM tracks WHERE track_name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY 1 LIMIT 10', $connect);

$data = array();
if ( $results && mysql_num_rows($results) )
{
while( $row = mysql_fetch_array($results, MYSQL_ASSOC) )
{
    $data[] = array(
        'label' => $row['shout'],
        'value' => $row['shout']
    );
}
}

echo json_encode($data);
flush();
?>

2)在新脚本中,替换dbhostdbusernamedbpassword&amp; dbname包含用于连接数据库的实际详细信息。 虽然我建议您没有将此信息存储在此文件中。将连接信息存储在单独的文件中要好得多,在webroot之外找到它并在此处“包含”

3)用您自己的查询替换查询。这就是我的设置方式,以便您可以看到需要更换的内容..

首先,它将搜索字符串重命名为shout(仅为了清晰起见),然后搜索表artist中的列albums,然后将artist与搜索{匹配} {1}}由自动填充功能生成。

此格式重复搜索以下内容......

来自term

name 来自albums的{​​{1}} 来自label

albums

只需将这些信息替换为列&amp;您要搜索的表格,保存文件并上传。

4)将以下搜索表单添加到track_name指向您搜索引擎的页面。

tracks

5)假设您已经在页面上加载了所需的.js库,您可以在某处完成这一段代码,然后就完成了!

pathtoyoursearchenginescript.php

注意:上面的代码假定您的webroot中有<form action="pathtoyoursearchenginescript.php" method="post"> Search: <input type="text" id="suggest" /> <input type="submit" value="Search" /> </form> ,如果不确定您使用文件的正确位置更新此代码。

希望这对某人有用;)

3 个答案:

答案 0 :(得分:1)

我会使用UNIONUNION会删除重复的值,因此您不需要DISTINCT关键字:

SELECT artist FROM mm_albums WHERE artist LIKE <value>
UNION SELECT name FROM mm_albums WHERE name LIKE <value>
UNION SELECT label FROM mm_albums WHERE label LIKE <value>
ORDER BY 1 LIMIT 10

这会从artistnamelabel列中提取关键字。

答案 1 :(得分:0)

$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" or name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" or label LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);

答案 2 :(得分:0)

这样的事情可以满足您的需求:

$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "%'.
  mysql_real_escape_string($_REQUEST['artist']) .'%" OR name LIKE "%'.
  mysql_real_escape_string($_REQUEST['track']) .'%" OR label LIKE "%'.
  mysql_real_escape_string($_REQUEST['label']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);

您还需要在REQUEST中传回更多参数 - 在这种情况下为三个,每个值对应您要查询的值。