查询MySQL表中的多个列(PHP)

时间:2014-08-15 12:58:31

标签: php mysql sql

我有一个名为:" ID,Track Name,City,County"等等。我正在寻找一种方法让用户查询数据库并获得与这4列相关的结果,最相关的结果显示在顶部。

说有一排:" 1,第一轨道,汤顿,萨默塞特" 和一行:" 2,Circuit Number Two,Taunton,Somerset" 并且用户在taunton"

中搜索了电路

显然我想要显示两行,但我希望第二行显示在顶部,因为它匹配了2个关键字。

这是我正在使用的当前代码,但它只在一列或另一列上工作,如果用户在taunton中查询" karting"它不会起作用。

$searchterm = htmlspecialchars($getArray['searchterm']);
$searchterm = $mysqli->real_escape_string($searchterm);

$terms = explode(' ', $searchterm);
$bits = array();
$cityBits = array();
$countyBits = array();

foreach ($terms as $term) {
    $bits[] = "name LIKE '%".mysql_real_escape_string($term)."%'";
}

foreach ($terms as $cityTerms) {
    $cityBits[] = "city LIKE '%".mysql_real_escape_string($cityTerms)."%'";
}

foreach ($terms as $countyTerms) {
    $countyBits[] = "county LIKE '%".mysql_real_escape_string($countyTerms)."%'";
}

$this->query = "SELECT * FROM tracks WHERE (".implode(' AND ', $bits).")
                union SELECT * FROM tracks WHERE (".implode(' AND ', $cityBits).")
                union SELECT * FROM tracks WHERE (".implode(' AND ', $countyBits).")";

我知道这段代码并不理想,但我现在已经成功完成了这项工作。

3 个答案:

答案 0 :(得分:1)

在我工作过的其中一个地方,我不得不用搜索引擎将歌曲搜索到数据库中(所以基本上你要做的事情)。我想出的解决方案是:当你将一首歌插入数据库时​​,你还会输入一些相关的关键词,这些关键词应该会在你输入时出现这首歌。

当有人搜索时,发生了什么事情:MJ,我的代码正在搜索艺术家姓名/歌曲标题的完全匹配。如果我有结果,我会按字母数字或用户想要的方式显示它们。

如果没有找到结果(这里是你感兴趣的部分),我的功能就是对每首歌的关键词进行查询。一旦我将所有结果,尤其是关联的关键字放入数组中,我只计算与每个结果的查询匹配的关键字数量,然后我就可以按相关性进行排序。

希望这会对你有所帮助,我猜你在数据库中只缺少一个“关键字”行。

答案 1 :(得分:1)

如果找到2个匹配项,您的查询将设置为返回2个相同的行。您可以重新命名它以返回行一次,以及计算匹配的ORDER BY子句。

"SELECT * FROM tracks WHERE (".implode(' AND ', $bits).") 
    OR (".implode(' AND ', $cityBits).")
    OR (".implode(' AND ', $countyBits).")
    ORDER BY ((".implode(' AND ', $bits).")
     + (".implode(' AND ', $cityBits).")
     + (".implode(' AND ', $countyBits).")) DESC"

这并不完全正确,因为我不确定你为什么要用" AND"而不是"或",但你得到了这个小说。

答案 2 :(得分:1)

首先,您的要求是full text searching比“比较”比较更好的匹配。一旦你完成这个工作,你就会想要提升“Taunton”而不是“Aunton”,然后处理不同的拼写,通配符,然后你会注意到你喜欢的声明中的通配符会减慢整个事情的速度。全文搜索为您完成所有这些,并且非常快。

你问题的具体答案是令人讨厌的;我不愿意给你代码PHP代码因为我不能轻易测试它。我已经创建了一个小SQLFiddle来展示如何在SQL中完成它。

实质上,您需要将单个搜索的“点击”转换为派生表,并计算每行的条目数;它在派生表中出现的次数越多,就越有可能成为“好”的命中。