2

我需要一些有关 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

任何人都可以给我一个提示吗?

谢谢

4

5 回答 5

2

您将需要使用子查询来获取min(date)byname然后将该结果加入到您的表中nameand上date

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

结果是:

|  NAME |                             MD |     CN |
---------------------------------------------------
|  Paul |   March, 01 2013 00:00:00+0000 | London |
| Peter | January, 28 2013 00:00:00+0000 |  Tokio |
于 2013-02-05T19:04:38.920 回答
0

您可以使用 IN 子句:

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

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

于 2013-02-05T21:00:11.227 回答
0

尝试这个::

SELECT Name, MIN(Date) as MD, City as CN FROM table GROUP BY Name
于 2013-02-05T19:04:11.043 回答
0

ALEFT 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

一个用于测试的 SQLfiddle

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

NAME    DATE          CITY
Paul    2013-03-01    London
Peter   2013-01-28    Tokio
于 2013-02-05T19:06:09.243 回答
0

这是你如何做到的。

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

演示

输出

Name  | Date        | City
-----------------------------
Paul  | 2013-03-01  | London
Peter | 2013-01-28  | Tokio
于 2013-02-05T19:08:06.503 回答