2015-04-03 69 views
1

我環顧這裏,無法找到答案,我似乎無法弄清楚這一點。 什麼我尋找的是這樣的:mySQL在兩個不同的表格中計數相似的行

我有兩個表: 表1:

+---------+---------------------+ 
| user_id | created_date  | 
+---------+---------------------+ 
|  1 | 2013-05-17 11:59:59 | 
|  1 | 2012-05-19 12:00:00 | 
|  1 | 2014-06-11 12:00:02 | 
|  1 | 2013-05-17 12:00:03 | 
|  3 | 2014-01-12 14:05:00 | 
|  3 | 2012-05-17 14:05:01 | 
|  3 | 2013-05-17 15:30:00 | 
+---------+---------------------+ 

表2:

+---------+---------------------+ 
| post_id | created_date  | 
+---------+---------------------+ 
|  1 | 2013-05-17 11:59:59 | 
|  1 | 2012-05-19 12:00:00 | 
|  1 | 2014-06-11 12:00:02 | 
|  1 | 2013-05-17 12:00:03 | 
|  3 | 2014-01-12 14:05:00 | 
|  3 | 2012-05-17 14:05:01 | 
|  3 | 2013-05-17 15:30:00 | 
+---------+---------------------+ 

我期待計數的兩個數用戶和我每月在數據庫中發佈的帖子數量。 結果應該像

+----------------+-------------+-------------+ 
| date   | users  | posts  | 
+----------------+-------------+-------------+ 
| january 2013 | 27   | 10   | 
| march 2013  | 108   | 101   | 
| june 2013  | 270   | 100   | 
| october 2013 | 2   | 1   | 
+----------------+-------------+-------------+ 

我已經開始MySQL查詢像這樣:

SELECT CONCAT_WS(' ', YEAR(u.date_created),MONTHNAME(u.date_created)) AS date,COUNT(*) AS users 
FROM users AS u 
UNION 
SELECT CONCAT_WS(' ', YEAR(p.date_created),MONTHNAME(p.date_created)) AS date,COUNT(*) AS posts 
FROM post AS p 
GROUP BY YEAR(date_created),MONTHNAME(date_created) 

但這僅返回兩列而不是三個。 任何幫助。

謝謝

回答

2

我認爲最簡單的方法是計算所有用戶(和設置的職位爲NULL的數量),再算上所有的文章(和設置用戶的NULL數),然後結合使用UNION ALL兩個查詢的結果,最後彙總使用SUM()計數和GROUP BY查詢:

SELECT 
    `date`, 
    SUM(users) AS users, 
    SUM(posts) AS posts 
FROM (
    SELECT 
    DATE_FORMAT(date_created, '%M %Y') AS `date`, 
    COUNT(*) AS users, 
    NULL AS posts 
    FROM 
    users 
    GROUP BY 
    DATE_FORMAT(date_created, '%M %Y') 

    UNION ALL 

    SELECT 
    DATE_FORMAT(date_created, '%M %Y') AS `date`, 
    NULL AS users, 
    COUNT(*) AS posts 
    FROM 
    posts 
    GROUP BY 
    DATE_FORMAT(date_created, '%M %Y') 
) s 
GROUP BY 
    `date` 
+0

完全符合我的要求。 非常感謝! – onlymushu 2015-04-03 22:17:01

0

您需要加入兩個查詢,而不是聯合它們。

SELECT u.date, users, posts 
FROM (
    SELECT CONCAT_WS(' ', YEAR(date_created),MONTHNAME(date_created)) AS date, COUNT(*) AS users 
    FROM users 
    GROUP BY date) AS u 
JOIN (SELECT CONCAT_WS(' ', YEAR(p.date_created),MONTHNAME(p.date_created)) AS date, COUNT(*) AS posts 
    FROM post 
    GROUP BY date) AS p 
ON u.date = p.date 

請注意,這將只返回具有用戶和帖子的月份。如果MySQL有FULL OUTER JOIN,你可以用它來解決它。如果這是一個問題,請使用fthiella的答案而不是此問題。

+0

是的,我試過,但我把它沒有回報正確的事情。 感謝您的回答! – onlymushu 2015-04-03 22:17:29

0

您正在使用聯合,它將兩個結果堆棧在同一列中。您需要一個加入,將日期作爲加入字段,以及來自兩個表的用戶和帖子。從table1中選擇日期,用戶,帖子t1內部連接table2 t2在t1.date = t2.date。

1

JOIN使用EXTRACT返回的共同YEAR_MONTH值的兩個派生表:

SELECT 
    CONCAT_WS('-', 
     YEAR(user_count.date_created), MONTHNAME(user_count.date_created) 
    ) AS date, 
    IFNULL(user_count,0) AS users, 
    IFNULL(post_count,0) AS posts 
FROM 
    ( 
     SELECT 
     COUNT(user_id) AS user_count, 
     EXTRACT(YEAR_MONTH FROM date_created) AS month_year, 
     date_created 
     FROM users 
     GROUP BY month_year 
) AS user_count 
LEFT JOIN 
    ( 
     SELECT COUNT(post_id) AS post_count, 
     EXTRACT(YEAR_MONTH FROM date_created) AS month_year, 
     date_created 
     FROM posts 
     GROUP BY month_year 
    ) AS post_count 
ON post_count.month_year = user_count.month_year 
相關問題