【问题标题】:mysql query group by namemysql 按名称查询组
【发布时间】:2013-02-05 19:01:50
【问题描述】:

我需要一些有关 MySQL 查询的帮助。

我有这张桌子:

姓名 |日期 |城市 ------+------------+------ 彼得 | 2013-04-01 |柏林 保罗 | 2013-03-01 |伦敦 彼得 | 2013-03-01 |纽约 彼得 | 2013-01-28 |东京

对于每个名字,我需要表格中的第一个日期和对应的城市。

我试过了:

SELECT Name, MIN(Date) as MD, MIN(City) as CN FROM table GROUP BY Name

但是日期不对应城市名称,结果是:

Peter, 2013-01-028, Berlin

谁能给我一个提示?

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您需要使用子查询通过name 获取min(date),然后将该结果加入到namedate 上的表中:

    SELECT t1.Name, 
      t1.Date as MD, 
      t1.City as CN 
    FROM yourtable t1
    inner join
    (
      select min(date) MinDate, name
      from yourtable
      group by name
    ) t2
      on t1.name = t2.name
      and t1.date = t2.mindate
    

    SQL Fiddle with Demo

    结果是:

    |  NAME |                             MD |     CN |
    ---------------------------------------------------
    |  Paul |   March, 01 2013 00:00:00+0000 | London |
    | Peter | January, 28 2013 00:00:00+0000 |  Tokio |
    

    【讨论】:

      【解决方案2】:

      试试这个::

      SELECT Name, MIN(Date) as MD, City as CN FROM table GROUP BY Name
      

      【讨论】:

      • 将返回最低日期和随机城市(不一定是与最低日期关联的城市)
      【解决方案3】:

      你可以这样做。

      SELECT
        m.Name,
        m.Date,
        m.City
      FROM mytable as m
      INNER JOIN (select min(date) as LDate, name from mytable group by name) as l
          on l.LDate = m.date
            and l.name = m.name
      group by m.name
      

      Demo

      输出

      Name  | Date        | City
      -----------------------------
      Paul  | 2013-03-01  | London
      Peter | 2013-01-28  | Tokio
      

      【讨论】:

      • Peter/2013-01-28关联的城市应该是东京。
      【解决方案4】:

      你可以使用 IN 子句:

      SELECT yourtable.*
      FROM   yourtable
      WHERE  (Name, Date) IN (SELECT Name, Min(Date)
                              FROM yourtable
                              GROUP BY Name)
      

      子查询将为每个名称返回名称及其最短日期。外部查询返回名称和日期与子查询返回的行相对应的所有行。

      【讨论】:

        【解决方案5】:

        LEFT JOIN 应该给出您想要的结果,而不会使查询过于复杂;

        SELECT m1.* FROM myTable m1
        LEFT JOIN myTable m2
          ON m1.Name = m2.Name
         AND m1.`date` > m2.`date`
        WHERE m2.Name is NULL
        

        An SQLfiddle for testing.

        它基本上会选择所有没有同名的旧行的行。

        NAME    DATE          CITY
        Paul    2013-03-01    London
        Peter   2013-01-28    Tokio
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-05
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          相关资源
          最近更新 更多