【问题标题】:mysql combine 2 table with a common group by columnmysql按列将2个表与一个公共组组合在一起
【发布时间】:2015-02-14 13:38:08
【问题描述】:

我有 2 个带日期的表格,采用时间戳格式, 我要数一数每周总共有多少条记录...

...只需一个查询即可获得结果...

所以我会用例子更好地解释它:

2表,第一个:

table name: visitor

ID  | time  | ref     (now i put in fake timestamp in time column sorry)
--------------------
1   | 3455  | john
2   | 3566  | ted     (week 40)
3   | 8353  | ted     (week 38)
4   | 6673  | katy
5   | 6365  | ted     (week 40)
6   | 4444  | john
7   | 3555  | ted     (week 40)

和第二个(非常相似):

table name: users

ID  | time  | ref     (now i put in fake timestamp in time column sorry)
--------------------
1   | 3455  | ted     (week 41)
2   | 3566  | ted     (week 42)
3   | 8353  | ted     (week 40)
4   | 6673  | katy
5   | 6365  | ted     (week 41)
6   | 4444  | john
7   | 3555  | ted     (week 38)
8   | 6789  | ted     (week 43)

我做这个查询,我得到这个结果:

SELECT WEEK(FROM_UNIXTIME(time)) AS week, COUNT( * ) AS tot
FROM visitor WHERE ref='ted' GROUP BY week

表格结果#1

week | tot
----------
38   |  1
40   |  3
43   |  1

我为第二张桌子做了一些:

SELECT WEEK(FROM_UNIXTIME(time)) AS week, COUNT( * ) AS totuser
FROM users WHERE ref='ted' GROUP BY week

表格结果#2

week | totuser
----------
38   |  1
40   |  1
41   |  2
42   |  1

但我只需要一个查询就可以得到这个结果:

week | tot | totusers
----------------------  (when both are 0 doent appear -like 39 for example-)
38   |  1  |   1
40   |  3  |   1
41   |  0  |   2
42   |  0  |   1
43   |  1  |   0

我知道我必须使用 LEFT JOIN、GROUP BY 和 IFNULL,但我总是做错事,我无法弄清楚。

按周顺序排列

感谢您的帮助。

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:

    从技术上讲,您想要的是full outer join,但 MySQL 不支持它。我使用union allgroup by 来解决这个问题:

    SELECT weeek, SUM(visitors) as visitors, SUM(users) as users
    FROM ((SELECT WEEK(FROM_UNIXTIME(time)) AS week, COUNT( * ) AS visitors, 0 as users
           FROM visitor
           WHERE ref='ted'
           GROUP BY week
          ) UNION ALL
          (SELECT WEEK(FROM_UNIXTIME(time)) AS week, 0, COUNT( * )
           FROM users
           WHERE ref ='ted'
           GROUP BY week
          )
         ) w
    GROUP BY week
    ORDER BY week;
    

    注意:与您的数据一样,这仅包括访问者或用户的周数。如果您不想要周数,最好从一个包含您想要的所有周数的表格开始(某种日历表)。

    【讨论】:

    • 谢谢你!我试过了,效果很好;)非常复杂!
    猜你喜欢
    • 2019-11-29
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2018-12-14
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多