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