首页 > 解决方案 > 如何在表中找到最大值,如果有相同的值,则从找到的数据中的最小ID中检索数据(mysql 5.5.36)

问题描述

我有两张表,分别带有身份结果的名称。我想根据具有最大值的rs_val列检索所有数据,然后按列identities.idn_yearidentities.idn_tag对数据进行分组

如果最大值相同,则以相同数据中最小的rs_id显示数据,但仍显示不同的数据年份和标签

**Table identities**
idn_kode | idn_name | idn_year | idn_tag 
IDN.001    Andi       2017         3
IDN.002    sarah      2017         3
IDN.003    Jhon       2017         3
IDN.004    Doe        2018         5
IDN.005    Mark       2018         5
IDN.006    Sisca      2018         5

**Table result**
rs_kode  |  idn_kode  |  rs_id   |  rs_val
RS.001      IDN.002       2          73
RS.002      IDN.004       4          90
RS.003      IDN.005       5          90
RS.004      IDN.006       6          85
RS.005      IDN.003       3          100
RS.006      IDN.001       1          65

我尝试使用此查询

SELECT * FROM (SELECT * FROM result ORDER BY rs_val DESC ) x INNER JOIN identities a on x.idn_kode = a.idn_kode GROUP BY a.idn_yer, a.idn_tag


**the results of the query above**
idn_name | idn_year | idn_tag  | id  | rs_val
Jhon         2017        3        3     100
Mark         2018        5        5      90

预期成绩

idn_name | idn_year | idn_tag  | rs_id  | rs_val
Doe          2018        5         4       90
Jhon         2017        3         3       100

请问,有人可以帮助我吗?

标签: phpmysql

解决方案


对于 MySql 8.0+,您可以使用ROW_NUMBER()

with cte as (
  select i.idn_name, i.idn_year, i.idn_tag, r.rs_id, r.rs_val, 
    row_number() over (partition by i.idn_year, i.idn_tag order by r.rs_val desc, r.rs_id) rn
  from identities i inner join result r
  on r.idn_kode = i.idn_kode
)  
select idn_name, idn_year, idn_tag, rs_id, rs_val
from cte
where rn = 1;

请参阅演示
结果:

| idn_name | idn_year | idn_tag | rs_id | rs_val |
| -------- | -------- | ------- | ----- | ------ |
| Jhon     | 2017     | 3       | 3     | 100    |
| Doe      | 2018     | 5       | 4     | 90     |


对于 MySql 5.5,请使用以下查询:

select i.idn_name, i.idn_year, i.idn_tag, min(r.rs_id) rs_id, t.val 
from identities i 
inner join result r on r.idn_kode = i.idn_kode
inner join (
  select i.idn_year, i.idn_tag, max(r.rs_val) val 
  from identities i inner join result r
  on r.idn_kode = i.idn_kode
  group by i.idn_year, i.idn_tag
) t on t.idn_year = i.idn_year and t.idn_tag = i.idn_tag and t.val = r.rs_val 
group by i.idn_year, i.idn_tag, t.val

要使此代码正常工作,您必须[ONLY_FULL_GROUP_BY][2]禁用 SQL 模式。
请参阅演示


推荐阅读