mysql组和订单行

0ve6wy6x  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(354)

我有下表'人'相同的人在不同的行

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/最新的日期创造的价值。
我试过了

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语句是不必要的,但在实际生活中,它将是一个自动完成字段的来源,所以我需要类似的想法如何管理它?

p1tboqfb

p1tboqfb1#

使用 NOT EXISTS :

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
muk1a3rh

muk1a3rh2#

您可以将子查询与组一起用于max 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
pxyaymoc

pxyaymoc3#

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 因为它是一个标识列,对于后者创建的记录来说,它无论如何都会更大,但显然会根据实际数据进行调整。

相关问题