【问题标题】:SQL SELECT COUNT of different conditions不同条件的 SQL SELECT COUNT
【发布时间】:2021-09-10 02:57:33
【问题描述】:

我有一个包含以下示例数据的表格

   IP          URL
=========   ========
1.1.1.1       aaaa
2.2.2.2       bbbb
1.1.1.1       ffff
1.1.1.1       aaaa
3.3.3.3       ssss
5.5.5.5       aaaa
7.7.7.7       bbbb
4.4.4.4       aaaa
1.1.1.1       aaaa
3.3.3.3       bbbb
5.5.5.5       aaaa

我需要选择这个结果:

 IP        URL    Total count of related IPs     Total count of current IP for current URL  
                             (DESC SORT)
=======   =====  =============================  ===========================================  
1.1.1.1   aaaa                6                                     3  
5.5.5.5   aaaa                6                                     2
4.4.4.4   aaaa                6                                     1
2.2.2.2   bbbb                3                                     1
7.7.7.7   bbbb                3                                     1
3.3.3.3   bbbb                3                                     1
1.1.1.1   ffff                1                                     1
3.3.3.3   ssss                1                                     1

我使用了一些类似以下的查询,但没有成功获得确切的结果:

SELECT ip, url, COUNT(ip) totalip FROM mytable
GROUP BY url ORDER BY totalip DESC

感谢任何帮助

【问题讨论】:

  • 您能否提供更多关于查询需要执行的搜索模式的描述?看到预期的结果后,我并不完全确定。谢谢!

标签: mysql sql join select count


【解决方案1】:

对于 MySql 8.0+,您可以使用 COUNT() 窗口函数:

SELECT DISTINCT IP, URL,
       COUNT(*) OVER (PARTITION BY URL) Total_count_of_related_IPs,
       COUNT(*) OVER (PARTITION BY IP, URL) Total_count_of_current_IP_for_current_URL
FROM tablename
ORDER BY Total_count_of_related_IPs DESC

对于以前的版本,使用自联接和聚合:

SELECT t1.IP, t1.URL,
       COUNT(*) Total_count_of_related_IPs,
       SUM(t1.IP = t2.IP) Total_count_of_current_IP_for_current_URL
FROM (SELECT DISTINCT * FROM tablename) t1 INNER JOIN tablename t2
ON t2.URL = t1.URL
GROUP BY t1.IP, t1.URL
ORDER BY Total_count_of_related_IPs DESC

请参阅demo

【讨论】:

    【解决方案2】:

    聚合和窗口函数

    select IP, URL, 
       sum(count(*)) over(partition by URL) TotalCountOf RelatedIPs, 
       count(*) TotalCountOfCurrentIPForCurrentURL 
    from tbl
    group by IP, URL
    order by URL, IP;
    

    【讨论】:

    • 按相关IP总数DESC排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多