Php mysql组和订单行

Php mysql组和订单行,php,mysql,sql,group-by,greatest-n-per-group,Php,Mysql,Sql,Group By,Greatest N Per Group,我在下表中列出了不同行中相同人员的“人员” id | firstname | surname | date_created ------------------------------------------------------ 3 | Nelli | Schaller | 2017-08-22 20:57:19 ------------------------------------------------------ 4 | Carl

我在下表中列出了不同行中相同人员的“人员”

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/最新日期\创造价值的独特Schaller

我试过这个

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
但是只获得预期的前两个条目(ID3和ID4),但我需要48和49。 正如在一些评论中提到的,在本例中LIKE语句是不必要的,但在现实生活中,它将是自动完成字段的源,所以我需要LIKE语句
您知道如何管理吗?

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

使用
不存在

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\u created
,则更改:

...AND id > p.id

这是SQL Server语法,但MySQL可能类似


我假设您的
id
字段不需要检查,也不需要检查创建的
date\u
,因为它是一个标识列,对于后者创建的记录,它会更大,但显然会根据您的实际数据进行调整。

您是否忘记在示例中包含group by?您编写的查询将返回4行,而不是2行。您是对的。editI会小心处理mysql中的GROUP BY。许多其他RDBMS会在该查询上出错,因为select中不在group by语句中的列需要具有聚合函数(MIN、MAX等)才能使查询有效。如果未指定聚合,MySQL将返回任何_值。完整名称仅用于清除,在现实生活中,它将是自动完成字段的源,因此我需要从一些特定的内容开始,然后您必须重新表述问题中的要求。哦,它们不是重复的。我必须承认,为了清楚起见,我遗漏了其他一些专栏。它们包含额外的数据,我必须保留所有这些Schaller。谢谢anyway@Ole_S然后只需使用SELECT part,它必须是:p2.date\u created...AND date_created > p.date_created
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