通过与我的sql匹配搜索查询和排序

时间:2014-07-22 16:06:55

标签: php mysql sql

您好我目前被困在这里,一直在研究如何编写一个mysql语句来灵活搜索产品,并根据我正在研究的项目的相关性对它们进行排序已经看过一些但是没有帮助请我需要有关如何使其工作的帮助,我目前的方法不起作用,就在这里。

用户在搜索字段中输入并提交" iPad 3rd Generation"。 我的脚本将字符串分解为这样的单词。

$termsExploded = array_unique(explode(' ', $term));

不,我使用php根据找到的单词数创建一个SQL查询。

$i = 0;

foreach ($termsExploded as $word) { 

        if (strlen($word)>1) {

            if ($i == 0) {

                $where_query = $where_query." name LIKE '%".$word."%'";
            }
            else{

                $where_query = $where_query." OR name LIKE '%".$word."%'";
            }

            $i++;
        }

    }

where查询变量现在看起来像这样。

name Like '%ipad%' Or name Like '%3rd%' Or name Like '%Generation%'

现在搜索这样的产品ID。

$IDs = "SELECT DISTINCT id FROM store_items WHERE".$where_query;

我现在创建第二个基于返回的ID的查询,如此

$where_query_s = null;

    $i = 0;

    foreach ($IDs as $result) {

        $returnID = $result->id;

        if ($i == 0) {

            $where_query_s = $where_query_s." id = ".$returnID."";
        }
        else{

            $where_query_s = $where_query_s." OR id = ".$returnID."";
        }

        $i++;

    };

现在我根据返回的不同ID再次选择产品

$items = "SELECT * FROM store_items WHERE".$where_query_s;

现在这可以获得产品,但我如何根据最佳匹配对其进行排序?

3 个答案:

答案 0 :(得分:1)

假设您想按匹配数量排序,那么按如下方式构建另一个字符串: -

ORDER BY IF(name Like '%ipad%', 1, 0) + IF(name Like '%3rd%', 1, 0) + IF(name Like '%Generation%', 1, 0) DESC

但这样做会很慢,并且不考虑索引以提高性能,也不考虑复数/单数(即,有人搜索'苍蝇'它不会正确排名'飞')。

将更多内容放入代码: -

$where_query = array();
$order_query = array();

foreach ($termsExploded as $word) 
{ 
    if (strlen($word)>1) 
    {
        $where_query[] = " name LIKE '%".$word."%'"
        $order_query[] = " IF(name Like '%".$word."%', 1, 0)"
    }
}

$IDs = "SELECT DISTINCT id FROM store_items WHERE ".implode(' OR ', $where_query)." ORDER BY ".implode(' + ', $order_query)." DESC";

答案 1 :(得分:0)

安排您的查询如下所示:

select field1, field2, etc, count(*) records
from store_items
where blah blah blah
group by field1, field2, etc
order by records desc

答案 2 :(得分:0)

如果该表是基于MyISAM的,或者它是InnoDB且版本是Mysql 5.6或更高版本,那么您可以使用全文搜索(参见http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

实际上你想要一个类似于

的查询

SELECT * FROM store_items WHERE MATCH (name) AGAINST ('iPad 3rd Generation') ORDER BY MATCH (name) AGAINST ('iPad 3rd Generation')