【问题标题】:Mysql OR conditions and sort by relevanceMysql OR 条件并按相关性排序
【发布时间】:2016-06-12 08:40:32
【问题描述】:

我正在使用动态数量的 OR 条件进行查询,具体取决于 $_GET[] 检索到的术语数量。

    if(isset($_GET['terms']))
    {
        $concat_search = 'AND wp_posts.ID = wp_term_relationships.object_id';

        $query_concat_strings .= 'AND (';

        $no_commas = rtrim($_GET['terms'], ", \t\n");

        $terms = explode(',', $no_commas);

        $total_terms = count($terms);

        for($x = 0; $x < $total_terms; $x++)
        {
            $term_id = term_exists($terms[$x], 'especialidad');

            if ($term_id !== 0 && $term_id !== null)
            {           
                if($x == 0)
                {
                    $query_concat_strings .= ' wp_term_relationships.term_taxonomy_id ='.$term_id[term_id];
                }
                else
                {
                    $query_concat_strings .= ' OR wp_term_relationships.term_taxonomy_id ='.$term_id[term_id];
                }
            }
        }
        $query_concat_strings .= ')';
    }

    $querystr = "
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta, $wpdb->term_relationships
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
        ".$concat_search."
        AND $wpdb->postmeta.meta_key = 'wpcf-fin-oferta'
        AND $wpdb->postmeta.meta_value > $currentdate
        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.post_type = 'oferta'".$query_concat_strings."
        ORDER BY $wpdb->posts.ID 
        LIMIT $start, $posts_per_page
        ";

//The query echoed: SELECT wp_posts.* FROM wp_posts, wp_postmeta, wp_term_relationships WHERE wp_posts.ID = wp_postmeta.post_id AND wp_posts.ID = wp_term_relationships.object_id AND wp_postmeta.meta_key = 'wpcf-fin-oferta' AND wp_postmeta.meta_value > 1456700400 AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'oferta' AND ( wp_term_relationships.term_taxonomy_id =50 OR wp_term_relationships.term_taxonomy_id =7)

这将返回匹配 wp_term_relationships.term_taxonomy_id =50 或 wp_term_relationships.term_taxonomy_id =7 的所有值,但我想对结果进行排序,优先考虑那些不仅匹配一个但更多条件的结果,首先是那些匹配更多条件的女巫其他人。

试过这个:

SELECT wp_posts.*, SUM(IF(wp_term_relationships.term_taxonomy_id ='11',1,NULL)) AS cond_matched, SUM(IF(wp_term_relationships.term_taxonomy_id ='50',1,NULL)) AS  cond_matched, SUM(IF(wp_term_relationships.term_taxonomy_id ='7',1,NULL)) AS cond_matched FROM wp_posts, wp_postmeta, wp_term_relationships WHERE wp_posts.ID = wp_postmeta.post_id AND wp_posts.ID = wp_term_relationships.object_id AND wp_postmeta.meta_key = 'wpcf-fin-oferta' AND wp_postmeta.meta_value > 1456786800 AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'oferta' GROUP BY wp_posts.ID ORDER BY cond_matched;

但结果似乎完全随机排序。 预期的结果应该是: 如果我搜索 1、2、3

结果 1:包含所有 3 个值的结果:1,2,3,4,5,6,7 结果 2:至少有 2 的人:1,3,7,9 结果3:只有1:3,11,90,12

【问题讨论】:

  • 检查stackoverflow.com/questions/16936891/…在此之前解决的问题会对您有所帮助
  • 对不起,也许我现在太困惑了,但我看不出这对我有什么帮助,而且我想我对这个问题的解释不太准确。我的查询在 WHERE 子句中有几个条件,最后我有这个 AND (condition1 = 'whatever' OR condition1 = 'whatever another' OR condition1 = 'whatever ever') 我遇到的问题是,只要其中一个条件是 TRUE 我会得到结果,但我想根据发现的巧合数量来缩短它们的相关性。如果这个解释更清楚,我会编辑这个问题。
  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 好吧,让我从头开始

标签: mysql relevance


【解决方案1】:

我唯一需要的是添加:

ORDER BY COUNT(*) DESC

在查询结束时。显然,在我看来,对 Mysql 的工作方式存在一些误解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2010-09-25
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2011-01-04
    • 2010-12-08
    • 2011-09-09
    相关资源
    最近更新 更多