【问题标题】:SQL Query to Sort the result according to maximum common results根据最大常见结果对结果进行排序的 SQL 查询
【发布时间】:2015-04-27 01:31:30
【问题描述】:

我在进行 SQL 查询时遇到问题。我正在制作一个小型搜索引擎,其中单词到页面的映射或索引是这样保存的。 抱歉,我无法在这里发布图片,所以我尝试像这样编写输出。

+---------+---------+-----------+--------+

| word_id | page_id | frequency | degree |

+---------+---------+-----------+--------+

|    2331 |      29 |         2 |      1 |

|    2332 |      29 |         7 |      1 |

|    2333 |      29 |         4 |      1 |

|    2334 |      29 |         1 |      1 |

|    2335 |      29 |         1 |      1 |

|    2336 |      29 |         1 |      1 |

|    2337 |      29 |         2 |      1 |

|    2338 |      29 |         7 |      1 |

|    2343 |      29 |         1 |      3 |

|    2344 |      29 |         1 |      3 |

......
......
...... and so on.

Word_id 指向存在于其他表中的单词,page_id 指向存在于其他表中的 URL。

现在假设我要搜索“快速 3D 原型制作服务”。我通过查询带来了与单个单词对应的结果的并集 ->

select * from words_detail where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710;

在上面的查询中,word_ids对应了搜索查询中的4个词,结果如下。

各个单词对应的page_id的联合...

mysql>

select * from words_detail where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710;


+---------+---------+-----------+--------+

| word_id | page_id | frequency | degree |

+---------+---------+-----------+--------+

|    2353 |      29 |         2 |      4 |

|    2353 |      33 |         2 |      2 |

|    2353 |      36 |         5 |      9 |

|    2353 |      40 |         1 |      4 |

|    2353 |      41 |         1 |      9 |

|    2353 |      45 |         4 |      9 |

|    2353 |      47 |         2 |      9 |

|    2353 |      49 |         4 |      9 |

|    2353 |      52 |         1 |      4 |

|    2353 |      53 |         1 |      9 |

|    2353 |      66 |         2 |      9 |

|    2364 |      29 |         1 |      4 |

|    2364 |      34 |         1 |      4 |

|    2364 |      36 |         9 |      2 |

|    2709 |      36 |         1 |      9 |

|    2710 |      36 |         1 |      9 |

+---------+---------+-----------+--------+

16 rows in set (0.00 sec)

但我希望根据最大匹配对结果进行排序。较早的结果应该是所有 4 个单词都匹配,下一个结果应该是 3 个匹配,依此类推。也就是说,前面的结果应该是4个word_id共有的page_id,接下来应该是3个word_id共有的page_id,以此类推。

我检查了here,但这在我的情况下不起作用,因为在我的情况下 OR 条件在一行中不匹配。

如何设计这样的查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用你page_id的出现作为匹配计数,然后按它排序。

    select * from words_detail A
    inner join 
    (SELECT PAGE_ID
    , COUNT(PAGE_ID) matchCount
    from words_detail 
    where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710
    group by PAGE_ID) B
    on A.PAGE_ID=B.PAGE_ID
    where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710
    order by matchCount desc
    

    【讨论】:

    • 谢谢,如果在上述查询的结果中,我们想在“频率”的基础上再次对结果进行排序,或者说表中的“度”属性,如果“匹配计数”相同,那么怎么做?排序只能在 matchCount 相等时在内部进行。
    【解决方案2】:

    试试这个

       select p.*
      from words_detail p
     , (select word_id, count(1) as count
      from words_detail where 
       word_id in (2353,2364,2709,2710) group by word_id) t
     where p.word_id = t.word_id
     order by t.count desc;
    

    【讨论】:

      【解决方案3】:

      您可以执行子查询来获取每个页面的出现次数。然后,您必须将子查询与您的表连接起来,您将能够按页面出现次数对结果进行排序。

      您的最终查询应如下所示:

        SELECT *
          FROM words_detail,
               (
                    SELECT page_id, 
                           COUNT(*) AS npages
                      FROM words_detail 
                     WHERE word_id IN (2353, 2364, 2709, 2710)
                  GROUP BY page_id
               ) AS matches
      
         WHERE words_detail.page_id = matches.page_id
           AND word_id IN (2353, 2364, 2709, 2710)
      ORDER BY matches.npages DESC
      

      【讨论】:

      • 如果在上述查询的结果中,我们想在“频率”的基础上再次对结果进行排序,或者说表中的“度”属性,如果“npages”是相同的,那么它如何可以吗?
      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 2011-09-28
      • 2013-08-09
      • 2017-05-09
      • 2016-03-17
      • 2010-10-03
      • 2021-08-19
      相关资源
      最近更新 更多