如何获取仅在dob列中具有匹配月份和年份的人员的ID

时间:2016-10-24 12:52:03

标签: mysql date group-by

在我的表格中,我有一些记录,并且它们有一些重复的出生日期值,所以我想要那些只有年和月匹配的人的id

我得到这样的输出:

enter image description here

但我的期望是:

id   dob(column name of table bday)

1  1989-12
3  1989-12
4  1985-11
6  1985-11

MySQL查询#1:

SELECT id, dob
FROM bday
WHERE dob IN (
    SELECT dob
    FROM bday
    GROUP BY dob
    HAVING COUNT(id) > 1
)

MySQL查询#2:

SELECT EXTRACT(YEAR_MONTH from dob) FROM bday group by dob having count(*) >1

我在这里获得如下输出:

id   dob(column name of table bday)
1    1989-12-22
3    1989-12-22
4    1985-11-27
6    1985-11-27

但实际上我只想要id的年份和月份。

2 个答案:

答案 0 :(得分:1)

See this post

答案:

SELECT 
id, DATE_FORMAT(dob, '%m-%d') AS date_month
FROM users 
WHERE 
DATE_FORMAT(dob, '%Y-%m') IN 
(
    SELECT 
        DATE_FORMAT(dob, '%Y-%m') AS date_month 
    FROM users  
    GROUP BY DATE_FORMAT(dob, '%Y-%m') 
    HAVING count(id) >1) ;
)

<强>解释

首先要做的是

  

&#34;获取&#39; dob&#39;的所有日期和月份柱&#34;

这可以通过基于使用格式构造提取的date_month对行进行分组来实现。

SELECT 
DATE_FORMAT(dob, '%m-%d') AS date_month 
FROM bday 
GROUP BY DATE_FORMAT(dob, '%m-%d');

根据您的问题,下一步是

  

&#34;仅匹配年份和月份的人们#34;

即,将上述结果分组为具有多于一行的条件。 这可以通过添加条件&#34; HAVING count(id)&gt;来实现。 1&#34;

现在查询变为

SELECT 
DATE_FORMAT(dob, '%m-%d') AS date_month 
FROM bday 
GROUP BY DATE_FORMAT(dob, '%m-%d') 
HAVING count(id) >1);

此查询返回所有date_month,其中多个人的dob会掉落。

现在你的最终目标是获得

  

&#34;那些只有年和月匹配的人的身份和#34;

这可以通过将此结果包装在子查询中来实现。 即,您必须获取所有具有日期和月份的ID,这些ID是使用上一个查询提取的结果集

SELECT 
id, DATE_FORMAT(dob, '%m-%d') AS date_month
FROM bday
WHERE 
DATE_FORMAT(dob, '%m-%d') IN 
(
    SELECT 
    DATE_FORMAT(dob, '%m-%d') AS date_month 
    FROM bday 
    GROUP BY DATE_FORMAT(dob, '%m-%d') 
    HAVING count(id) >1) ;
)

我的表结构 My table structure

表格中的数据 My entries

查询和结果 Query and results

答案 1 :(得分:0)

    SELECT EXTRACT(YEAR_MONTH from date)
 FROM table group by date having count(*) >= 2 

试试这个

select YEAR(date) AS 'year', MONTH(date) AS 'month' COUNT(*) c FROM table GROUP BY column HAVING c > 1