В MySQL: выборка строк по годам - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть таблица MySQL, похожая на эту:

| id | name | create_date |
---------------------------
| 1  | foo  | 2003-03-11  |
| 2  | goo  | 2003-04-27  |
| 3  | woo  | 2004-10-07  |
| 4  | too  | 2004-12-01  |
| 5  | hoo  | 2005-04-20  |
| 6  | koo  | 2006-01-12  |
| 7  | boo  | 2006-04-17  |
| 8  | moo  | 2006-08-19  |

Я хочу получить все последние годовые строки - по одному в год. Так что в приведенном выше примере я получу 2, 4, 5 и 8.

Какой правильный синтаксис?

Ответы [ 5 ]

2 голосов
/ 23 сентября 2009

Некоторые другие ответы могут работать для вас, но этот простой запрос не требует никаких объединений

SELECT YEAR(create_date),
(SELECT id ORDER BY create_date DESC LIMIT 1)
FROM mytable
group by YEAR(create_date)
1 голос
/ 22 сентября 2009

вы можете сделать что-то вроде

выберите * из таблицы имя где create_date в ( выберите максимум (дата создания) из таблицы группа по годам (create_date))

0 голосов
/ 23 сентября 2009
select id
from mytable
where not exists (
  select * from mytable as T2
  where T2.id = mytable.id
  and T2.id >= year(created_date) + 1
)
0 голосов
/ 22 сентября 2009
SELECT  mi.*
FROM    (
        SELECT  DISTINCT YEAR(created_date) AS dyear
        FROM    mytable
        ) md
JOIN    mytable mi
ON      mi.id =
        (
        SELECT  id
        FROM    mytable ml
        WHERE   ml.create_date < CAST(CONCAT_WS('.', dyear + 1, 1, 1)) AS DATETIME)
        ORDER BY
                ml.create_date DESC
        LIMIT 1
        )
0 голосов
/ 22 сентября 2009
SELECT id FROM foo JOIN
  (SELECT YEAR(create_date),MAX(create_date) AS md
     FROM foo
     GROUP BY YEAR(create_date)) as maxes
ON (create_date=md);

Если вы поместите индекс в create_date, это будет довольно быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...