mySQL统计两个不同表中的相似行

mySQL统计两个不同表中的相似行,mysql,Mysql,我环顾四周,找不到答案,似乎也弄不明白。 我要找的是: 我有两张桌子: 表1: 表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:

表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)
但这只返回两列,而不是三列。 任何帮助


谢谢

您需要加入这两个查询,而不是合并它们

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有
完全外部连接
,您可以使用它来绕过它。如果这是一个问题,请使用fthiella的答案而不是这个答案。

您使用的是一个并集,它将两个结果堆叠在同一列中。您需要一个连接,日期作为连接字段,以及两个表中的用户和帖子。选择date,users,posts from table1 t1 internal join table2 t2 on t1.date=t2.date。

我认为最简单的方法是统计所有用户(并将帖子数量设置为NULL),然后统计所有帖子(并将用户数量设置为NULL),然后使用UNION all组合两个查询的结果,最后使用SUM()聚合计数和查询分组:

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`

使用
EXTRACT
返回的通用
YEAR\u-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

是的,我试过了,但我没用对。谢谢你的回答!
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