我需要从另一个问题中解决的问题升级:检索每个组中的最后一条记录-mysql
我的问题很相似,但我不能达到我需要的结果。
在我的第一张table上 VAT_types
我用他们的名字来定义什么样的价格
id type
--------------
1 ordinaria
2 ridotta
3 minima
4 esente
在我的第二张table上 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(),它将显示该日期之前所有可用的费率。
现在我想按vat类型对它们进行分组,只检索最后更新的一个。所以我在这里查了一下,发现上面有一个链接的解决方案,我做了如下调整:
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中使用这个查询并调整日期一次,以便检索正确的费率和所需的具体费率。
如何简化上述查询?
2条答案
按热度按时间fhg3lkii1#
您可以在子查询中使用按类型划分的最大日期组的内部联接
rfbsl7qr2#
通常使用以下方法找到每组中最大的