【问题标题】:How to get id of those persons who have matching month and year only in dob column如何仅在 dob 列中获取月份和年份匹配的人的 id
【发布时间】:2017-03-06 06:17:12
【问题描述】:

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

我得到这样的输出:


但我的期望是:

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 的年份和月份。

【问题讨论】:

    标签: mysql date group-by


    【解决方案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) ;
    )
    

    说明:

    你首先要做到的是

    "获取'dob'列的所有日期和月份"

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

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

    根据你的问题,下一步是

    “只有匹配年份和月份的人”

    即,将上述结果与具有多于一行的条件分组。 这可以通过添加条件“HAVING count(id) > 1”来实现

    现在查询变成了

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

    此查询返回超过一个人的出生日期的所有 date_month。

    现在你的最终目标是得到

    " 仅匹配年份和月份的人的 id"

    这可以通过将此结果包装在子查询中来实现。 即,您必须获取所有日期和月份的 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) ;
    )
    

    我的表结构

    表格中的数据

    查询和结果

    【讨论】:

    • 你好@lma 非常感谢它为我工作,你太棒了
    【解决方案2】:
        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
    

    【讨论】:

    • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
    • 它不起作用我需要 id dob 列 bco'z id 引用那个重复的人,所以像这样提取制作新的列我得到输出提取(来自 dob 的 YEAR_MONTH)=198912 我将再次更新我的问题请查看此
    • 嗨@mhmd 我也试过了,但它显示错误(之前发现了一个别名。c 附近),感染我的列数据类型是日期仍然没有得到所需的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2019-05-18
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多