我有如下查询:
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
上的最后一个数据,但是查询不起作用。
答案 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选中greatest-n-per-group。
答案 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)
这不是聚合查询。这是一个过滤查询。