我有下表“persons”,不同行中有相同的人
id | firstname | surname | date_created
------------------------------------------------------
3 | Nelli | Schaller | 2017-08-22 20:57:19
------------------------------------------------------
4 | Carl | Schaller | 2019-06-21 08:29:45
------------------------------------------------------
48 | Nelli | Schaller | 2020-06-25 13:06:09
------------------------------------------------------
49 | Carl | Schaller | 2020-06-25 13:06:09
我想要得到的是具有最大id/最新的date_created值的所有唯一的Schallers。
我试过了
SELECT id, CONCAT(surname, ", ", firstname) AS person, date_created
FROM persons
WHERE
surname LIKE "schall%"
GROUP by firstname, surname
ORDER BY date_createdDESC, surname ASC LIMIT 0, 10
但只得到预期的前两个条目(id 3和4),但我需要48和49。 正如在一些评论中提到的,在这种情况下,LIKE语句不是必需的,但在现实生活中,它将是一个自动完成字段的来源,所以我需要LIKE,任何想法,如何管理它?
使用不存在
:
SELECT p.id, CONCAT(p.surname, ', ', p.firstname) AS person, p.date_created
FROM persons p
WHERE p.surname LIKE '%schall%'
AND NOT EXISTS (SELECT 1 FROM persons WHERE firstname = p.firstname AND surname = p.surname AND id > p.id)
ORDER BY p.date_created DESC, person
如果选择每个组中最新一个的条件是列date_created
,则更改:
...AND id > p.id
与
...AND date_created > p.date_created
可以将子查询与组一起用于最大id
select t.max_id, t.person, m.date_created
from (
SELECT max(id) max_id, CONCAT(surname, ", ", firstname) AS person
FROM persons
WHERE surname LIKE "schall%"
ORDER BY date_createdDESC, surname ASC
GROUP BY CONCAT(surname, ", ", firstname)
) t
inner join persons m ON CONCAT(m.surname, ", ", m.firstname) = t.person
and m-id = t.max_id
SELECT p.*
FROM persons p
LEFT JOIN persons p2 ON p2.firstname = p.firstname
AND p2.lastname = p.lastname
AND p2.date_created > p.date_created
WHERE p2.id IS NULL
这是SQL Server的语法,但MySQL可能类似。
我假设您的id
字段和date_created
字段都不需要检查,因为它是一个标识列,而且对于后者创建的记录来说会更大,但显然要根据您的实际数据进行调整。