在 GROUP BY 连接中选择最高值

Posted

技术标签:

【中文标题】在 GROUP BY 连接中选择最高值【英文标题】:Choosing highest value in a GROUP BY Join 【发布时间】:2021-03-10 13:34:39 【问题描述】:

我有一个pages 表,其中包含 URL 及其关联的类别。我将使用constraints 表和GROUP BY 将其与ITSELF 一起加入以获得唯一的URL,然后按最高分排序。

问题:并不总是选择 URL 组中得分最高的。

(背景:在生产中,这将用于了解“来自”类别中的哪些页面应该超链接到“到”类别中的页面)

我认为this answer 中有一些东西,但我不知道如何适应它:

当前查询

SELECT keyword, URL, score FROM
    (   
        SELECT keyword, URL, score
        FROM pages
        JOIN constraints
        ON pages.category = constraints.to
        AND constraints.from IN (SELECT category FROM pages WHERE URL = 'https://www.example.net')
        ORDER BY score DESC
    )   
AS x        
GROUP BY URL;

页面

+---------+-------------------------+----------+-------+
| keyword | URL                     | category | score |
+---------+-------------------------+----------+-------+
| Cat     | https://www.example.org | 1        | 100   |
+---------+-------------------------+----------+-------+
| Dog     | https://www.example.com | 2        | 50    |
+---------+-------------------------+----------+-------+
| Fish    | https://www.example.com | 2        | 60    |
+---------+-------------------------+----------+-------+
| Mouse   | https://www.example.net | 3        | 1     |
+---------+-------------------------+----------+-------+

约束

+------+----+
| from | to |
+------+----+
| 1    | 2  |
+------+----+
| 2    | 1  |
+------+----+
| 3    | 2  |
+------+----+

电流输出:

+---------+-------------------------+-------+
| keyword | URL                     | score |
+---------+-------------------------+-------+
| Dog     | https://www.example.com | 50    |
+---------+-------------------------+-------+

选择了狗行,尽管分数低于鱼行。

期望的输出:

+---------+-------------------------+-------+
| keyword | URL                     | score |
+---------+-------------------------+-------+
| Fish    | https://www.example.com | 60    |
+---------+-------------------------+-------+

编辑:将表格简化为最小的可重现示例。添加了电流输出。并且解释得更好一些。

【问题讨论】:

你的mysql是什么版本的? 请描述您是如何获得“所需输出”的。 (换句话说,不要让别人猜测或假设) @Strawberry 对不起,我以为我已经把它缩小了,但我会再试一次 我迷路了。您在约束表中有“4”,但它不在您的数据中。您为某些 URL 指定其他 URL 需要什么 - 但结果基于什么 URL? 太棒了。什么时候告诉我们。 【参考方案1】:

根据您的数据,我尝试解决问题。 我的逻辑如下:

    我开始构建一个非规范化表,即table x,其中包含有关页面遍历的信息,即从页面到页面也带有各自的URL。李> 在table y 中,使用dense_rank() 函数有助于排名您的结果。 从 table y 开始,只有 rank 1 记录必须被挑选并删除重复的 group by 被使用。

我的查询如下:

select to_keyword as Keyword, to_url as URL, to_score as Score 
    from (
     select from_url, to_keyword, to_url, to_score, dense_rank() over (partition by to_url order by to_score desc) as rnk 
       from ( select p.url as from_url, u.Keyword as to_keyword, u.url as to_url, u.Category as to_category, u.Score as to_score 
              from pages p inner join constrains c on p.Category = c.from inner join pages u on u.Category = c.to
             )x
         ) y 
    where rnk = 1 and from_url = 'https://www.b.com/' 
    group by 1, 2, 3
    order by to_url

【讨论】:

以上是关于在 GROUP BY 连接中选择最高值的主要内容,如果未能解决你的问题,请参考以下文章

如何通过内部连接使用 group by

如何在 SQL 中连接多个表和 GROUP BY

带有连接和group by子句的选择查询中的MySQL性能问题

oracle group by 性能优化

在连接中使用 Where 子句,以及 Group by 和 Order By

在 Access 中连接记录和 GROUP BY