【问题标题】:MySQL show closest match firstMySQL首先显示最接近的匹配
【发布时间】:2017-02-28 14:24:43
【问题描述】:

我有一个功能,可以根据用户搜索搜索 Wordpress 类别的匹配项,它工作正常,但是我想在结果顶部显示与搜索最接近的匹配项。例如,如果用户搜索“附件”,我希望先显示它,然后再显示任何其他匹配项。理想情况下,它们将按相关性排序,但我不确定如何实现。

目前,下面的代码按在查询中找到它们的顺序而不是按特异性显示它们。下面的代码产生以下结果。

代码返回什么

Exhaust Accessories
Accessories
Centre Stand Accessories
Rear Stand Accessories
Side Stand Accessories

我正在使用的代码

$arr = explode(' ','Accessories');
    $str = '';
    $i = 1;
    $arrCount = count($arr);

    foreach($arr as $v){
        if($arrCount > 1 && $i == 1) { $str.= '('; }
        $str.= 'wpmj8c_terms.name LIKE "%'.$v.'%" ';
          if($arrCount > 1 && $arrCount == $i) { $str.= ')'; } elseif($arrCount > 1 && $arrCount != $i) { $str .= " OR " ;}
        $i++;
    }

$cat = $wpdb->get_results("SELECT *
    FROM wpmj8c_term_relationships
    LEFT JOIN wpmj8c_term_taxonomy
    ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id)
    LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id
    WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat'  AND  $str
    GROUP BY wpmj8c_term_taxonomy.term_id");

【问题讨论】:

  • 您想与 $str 比较哪个列名?
  • product_cat 我想
  • 保存结果的列是哪一列?是wpmj8c_terms.name吗?
  • 正确,你可以在foreach中看到。
  • 我认为使用“Match Against”可能会更快,更容易排名。

标签: php mysql wordpress


【解决方案1】:

你好_

我会给你一个简单但不太灵活的解决方案。

所以我的想法是ORDER BY 找到结果字符数。在这种情况下,我们可以假设字符较少的结果是最接近或完全匹配的。

您的sql 查询将如下所示:

"SELECT *
    FROM wpmj8c_term_relationships
    LEFT JOIN wpmj8c_term_taxonomy
    ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id)
    LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id
    WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat'  AND  $str
    GROUP BY wpmj8c_term_taxonomy.term_id
    ORDER BY LENGTH(wpmj8c_terms.name)"

此查询应输出以下结果:

Accessories
Exhaust Accessories
Rear Stand Accessories
Side Stand Accessories
Centre Stand Accessories

我想再次告诉你,这只是一个想法,不是很灵活,但我希望你明白这一点。

祝你好运!

【讨论】:

  • 如果您使用双引号,它将起作用。这是PHP 的一个功能。把SELECT命令放在"SELECT ... $str"之间就可以直接放变量名了
  • 哦,我认为'column_name = $str'
  • 如果你这样做'SELECT $str' 这将是错误的,无论如何你能多快地建立这个表:)
  • 再一次:如果你想在其中直接使用变量,你需要把你的字符串放在双引号之间,你的字符串应该看起来像 "SELECT * from table_name $str" 而不是 'SELECT * from table_name $str'$str 应该包含一些东西当然,例如$str='WHERE some condition ...';
【解决方案2】:

您可以使用like 子句搜索字符串并使用order by 对列进行排序

$arr = explode(' ','Accessories');
$str = '';
$str1 = '';
$i = 1;
$arrCount = count($arr);

foreach($arr as $v){
    if($arrCount > 1 && $i == 1) { $str.= '('; }
    $str.= 'wpmj8c_terms.name LIKE "%'.$v.'%" ';
    $str1.='OR wpmj8c_terms.name LIKE "%"';
      if($arrCount > 1 && $arrCount == $i) { $str.= ')'; } elseif($arrCount > 1 && $arrCount != $i) { $str .= " OR " ;}
    $i++;
}

$cat = $wpdb->get_results("SELECT *
FROM wpmj8c_term_relationships
LEFT JOIN wpmj8c_term_taxonomy
ON (wpmj8c_term_relationships.term_taxonomy_id = wpmj8c_term_taxonomy.term_taxonomy_id)
LEFT JOIN wpmj8c_terms on wpmj8c_term_taxonomy.term_taxonomy_id = wpmj8c_terms.term_id
WHERE wpmj8c_term_taxonomy.taxonomy = 'product_cat'  AND $str $str1 
GROUP BY wpmj8c_term_taxonomy.term_id order by wpmj8c_terms.name = $str");

【讨论】:

  • ORDER BY 应该在GROUP BY 之后
  • 现在看起来更好了:)
  • product_cat 是您的列名吗?
  • 我认为,如果您查看包含在查询本身中的 foreach,它可能有助于理解正在发生的事情。专栏是wpmj8c_terms.name
  • 请注意,结果必须与 foreach 一起使用,因为这是查询本身的一部分。
猜你喜欢
  • 2019-10-14
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多