如何在MySQL上显示每个组的最后一个数据(最大数据)

时间:2018-10-05 09:24:08

标签: mysql sql

我有如下查询:

SELECT kd.id_karir, kd.nama, kd.kelamin, 
        (YEAR(NOW())-YEAR(tanggal)) usia, MAX(pf.jenis), pf.jenis, 
        pf.nama AS pendidikan, pf.jurusan, kd.alamat, kd.telepon, 
        kd.handphone, kd.email, kd.tempat AS tempat_lahir, 
        kd.tanggal AS tanggal_lahir 
FROM keadaan_diri AS kd 
    LEFT OUTER JOIN pendidikan_formal AS pf ON (kd.id_karir = pf.id_karir) 
WHERE kd.id_karir = 'P1409047' 
GROUP BY kd.id_karir 
ORDER BY kd.nama ASC, pf.jenis DESC

我的意思是使用max和group返回表pendidikan_formal上的最后一个数据,但是查询不起作用。

2 个答案:

答案 0 :(得分:0)

首先,您可以/应该(取决于MySQL配置)仅按group by子句中的列进行选择和排序。对于所有其他列,您必须指定一个aggregation function。例如,假设您有两条关于人类的记录,它们的名字相同且年龄不同。按名称分组时,必须选择两个年龄值之一(最大,最小,平均...)。如果您不关心哪个,则可以关闭sql模式only full group by。但是我不建议这样做。

但是,为了获得一个具有某个最大值的记录,分组不是正确的方法。看一下这些例子:

子选择:

SELECT name, age, ...
FROM   humans
WHERE  age=(SELECT MAX(age) FROM humans);

订购和限制:

SELECT name, age, ...
FROM humans
ORDER BY age DESC
LIMIT 1;

左加入:

SELECT name, age, ...
FROM humans h1
LEFT JOIN humans h2 ON h1.age < h2.age
WHERE h2.age IS NULL;

现在,如果您要所有最大行每个组,请用标签one of these answers选中

答案 1 :(得分:0)

您可以使用相关子查询。您的问题有点含糊;我假设id_karir是组,tanggal是日期。

如果我理解正确,那么该查询将适用于您的查询,

SELECT kd.id_karir, kd.nama, kd.kelamin, 
        (YEAR(NOW())-YEAR(tanggal)) usia, pf.jenis, pf.jenis, 
        pf.nama AS pendidikan, pf.jurusan, kd.alamat, kd.telepon, 
        kd.handphone, kd.email, kd.tempat AS tempat_lahir, 
        kd.tanggal AS tanggal_lahir 
FROM keadaan_diri kd LEFT OUTER JOIN
     pendidikan_formal pf
     ON kd.id_karir = pf.id_karir AND
        pf.tanggal = (SELECT MAX(pf2.tanggal) FROM pendidikan_formal pf2 WHERE pf2.id_karir = pf.id_karir)

这不是聚合查询。这是一个过滤查询。