首页 > 解决方案 > SQL - 从不同的对计数

问题描述

我有一张表,表示在 FB 上的朋友之间发送消息:

    Sender    Receiver   Msgs #

     Dave       John        6     
     John       Dave        1    
     Sam        Dave        2   
     Mark       Ash         1    
     Ash        Dave        3 
     Mark       Steve       8     

什么是 SQL 查询来显示有多少人有 1,2,3... 朋友:

    Num of friends       Quantity
          1                 3
          2                 2
          3                 1

我尝试过使用循环,但它变得太复杂了......

标签: mysqlsql

解决方案


您可以通过以下方法使用几个子查询来实现此目的:

  1. 所有唯一发送者和接收者的列表。
  2. 每个唯一发件人的朋友数计数。
  3. 将朋友的数量分组并计算出现的次数。

这是一些显示它工作的代码(显然字段名称需要更改以匹配您的实际表):

CREATE TABLE msgs (Sender VARCHAR(20), Receiver VARCHAR(20), Msgs INT);

INSERT INTO msgs VALUES ('Dave', 'John', 6), ('John', 'Dave', 1),('Sam', 'Dave', 2),('Mark', 'Ash', 1),   ('Ash', 'Dave', 3),('Mark', 'Steve', 8);

SELECT  FriendCount AS `Num of friends`,
        COUNT(*) AS Quantity
  FROM  (
        SELECT  Sender,
                COUNT(*) AS FriendCount
          FROM  (
                SELECT DISTINCT
                        Sender,
                        Receiver
                  FROM  msgs
                UNION
                SELECT DISTINCT
                        Receiver,
                        Sender
                  FROM  msgs
                ) a
          GROUP BY Sender
        ) a
  GROUP BY FriendCount
  ORDER BY FriendCount;

DROP TABLE msgs;

输出:

Num of friends   Quantity
1                3
2                2
3                1

推荐阅读