【问题标题】:Counting all distinct rows, and then join with another table计算所有不同的行,然后与另一个表连接
【发布时间】:2020-03-13 11:24:51
【问题描述】:

每天我都会检查一个包含来自多个无线网络的所有信息的日志文件。我制作了一个小型C#/SQLite 应用程序,可将日志文件导入数据库。

然后,我通过它们的 mac 地址选择(并计数)所有不同的访问点,并按计数对它们进行排序。

我已经能够编写一个查询来解决这个问题,但我很难从另一个表中获取访问点名称。

表格

问题

日期时间
ap_mac_address
client_mac_address
问题

ap

mac
名字

我的查询:

SELECT DISTINCT ap_mac_address as [AP MAC Address],
COUNT(ap_mac_address) as Number
FROM issues
GROUP BY ap_mac_address
ORDER BY Number DESC

这给了我想要的结果,但是当我尝试将其与另一个表中的接入点名称结合起来时,我卡住了。

谁能指出我正确的方向?

对不起 - 英语不是我的母语,我是编程初学者...

【问题讨论】:

  • 外部链接中的列名与您在问题中描述的任何一个表都不匹配。请修复您的数据。

标签: sql sqlite join


【解决方案1】:

加入之前聚合可能更有效:

select [AP MAC Address], Name, Number
from
 (
   SELECT ap_mac_address as [AP MAC Address],
      COUNT(ap_mac_address) as Number
   FROM issues 
   GROUP BY ap_mac_address
 ) as i
-- Outer Join if there's a mac address not mapped
LEFT JOIN ap ON ap.map = i.ap_mac_address 
ORDER BY Number DESC

顺便说一句,GROUP BY 已经返回唯一数据,不需要额外的 DISTINCT。

【讨论】:

    【解决方案2】:

    这是一个规范的 JOIN/GROUP BY 查询。我会推荐:

    SELECT ap.Name, i.ap_mac_address as [AP MAC Address],
           COUNT(*) as Number
    FROM issues i JOIN
         ap
         ON ap.map = i.ap_mac_address 
    GROUP BY ap.Name, i.ap_mac_address
    ORDER BY Number DESC;
    

    注意事项:

    • 限定所有列名。也就是说,指定它们来自的表。
    • 使用表别名。
    • SELECT DISTINCT 几乎从不与 GROUP BY 一起使用。

    【讨论】:

      【解决方案3】:

      我相信以下内容会如你所愿:-

      SELECT DISTINCT ap_mac_address as [AP MAC Address],
      COUNT(ap_mac_address) as Number, Name /* ADDED (including the comma) */
      FROM issues 
          JOIN ap ON ap.map = issues.ap_mac_address /* ADDED */
      GROUP BY ap_mac_address
      ORDER BY Number DESC
      

      这确实假设 ap 是 mac 地址并且是唯一的。

      【讨论】:

      • 这给了我想要的结果!谢谢!
      猜你喜欢
      • 2016-01-13
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      相关资源
      最近更新 更多