我需要从已经在另一个问题中解决的问题升级:Retrieving the last record in each group - MySQL
我的问题非常相似,但是我无法获得所需的结果。
在我的第一张表VAT_types
中,通过其名称定义了可用的费率
id type
--------------
1 ordinaria
2 ridotta
3 minima
4 esente
在我的第二张表VAT_rates
中,根据法律何时将其正式化,我有多个增值税税率,这些税率将不时更新,但必须始终提供所有税率的记录
id date type rate
-----------------------------
1 2013-01-01 1 22.0000
2 2013-01-01 2 10.0000
3 2013-01-01 3 4.0000
4 2000-01-01 4 0.0000
9 2019-01-01 2 11.5000
10 2021-01-01 2 12.0000
11 2019-01-01 1 24.2000
12 2021-01-01 1 25.0000
因此,如果我想按照当前日期(或将来的日期)过滤它们,我只需要像这样查询它们:
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
"2022-11-22"
可以是任何日期,实际上,如果我将其更改为CURDATE(),它将显示该日期之前的所有可用费率。
现在,我想按大桶类型对它们进行分组,并仅检索最近更新的大桶。所以我在这里抬头,发现上面链接的解决方案我做了如下调整:
SELECT T1.*
FROM (
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
) T1
LEFT JOIN (
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
) T2
ON (T1.type = T2.type AND T1.id < T2.id)
WHERE T2.id IS NULL
ORDER BY T1.rate DESC;
结果将是:
id type date rate
--------------------------------
12 Ordinaria 2021-01-01 25,0000
10 Ridotta 2021-01-01 12,0000
3 Minima 2013-01-01 4,0000
4 Esente 2000-01-01 0,0000
这似乎可行,但是当然太复杂了。我也希望在我的php中使用此查询,并只对日期进行一次调整,以检索正确的费率,然后再获取所需的特定费率。
如何简化上面的查询?
答案 0 :(得分:2)
您可以按类型在子查询上使用内部联接以获取最大日期分组
select VAT.id, TYPE.type, VAT.date, VAT.rate
from VAT_rates VAT
inner JOIN VAT_types TYPE on TYPE.id = VAT.type
inner join (
select max(VAT.date) max_date, TYPE.type
from VAT_rates VAT
INNER JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE str_to_date(VAT.date, '%Y-%m-%d') <= str_to_date("2022-11-22", '%Y-%m-%d')
group by TYPE.type
) T on T.max_date = VAT.date and T.type = TYPE.type
答案 1 :(得分:1)
通常使用以下方法在每个组中找到最大的
C T