![](/img/trans.png)
[英]How to select the option which is in `location_id` in `shops` table in laravel?
[英]Mysql Select from table where a date is max for each unique location_id AND product
我有一張表 - 記錄 - 看起來像這樣
id | location_id | product | stock | date
===|=============|=========|=======|======
1 | Bakery 1 | cake | 21 | 2
2 | Bakery 1 | bread | 23 | 2
3 | Bakery 2 | cake | 21 | 2
4 | Bakery 2 | bread | 21 | 2
5 | Bakery 1 | cake | 21 | 3
6 | Bakery 1 | bread | 23 | 3
7 | Bakery 2 | cake | 21 | 3
8 | Bakery 2 | bread | 21 | 3
9 | Bakery 1 | cake | 21 | 4
10 | Bakery 1 | bread | 23 | 4
11 | Bakery 2 | bread | 23 | 4
對於每個位置和每個產品,我想選擇具有最高日期值的行。 這將是什么樣子
id | location_id | product | stock | date
===|=============|=========|=======|======
7 | Bakery 2 | cake | 21 | 3
9 | Bakery 1 | cake | 21 | 4
10 | Bakery 1 | bread | 23 | 4
11 | Bakery 2 | bread | 23 | 4
如何使用一個查詢執行此操作? 我可以循環遍歷所有位置和所有產品並構建查詢但是它的時間和內存消耗更多?
select r1.*
from records r1
join
(
select location_id, product, max(date) as date
from records
group by location_id, product
) r2 on r1.location_id = r2.location_id
and r1.product = r2.product
and r1.date = r2.date
如果滿足以下條件,則可以使用id
列非常有效地完成此任務
id
列是自動增量的 date
列表示當前日期:即,您永遠不會插入回溯記錄。 date
列 如果這些條件為真,則表示唯一標識符id
可用作每條記錄的非唯一值date
的代理。 具有更高date
值的行始終保證具有更高的id
值。
如果您可以這樣做,您可以使您的查詢執行得非常好。
首先,創建一個子查詢,以獲取每個位置和產品組合的最新行的id
。
SELECT MAX(id)
FROM records
GROUP BY location_id, date
然后使用該組id
值從表中提取正確的記錄
SELECT *
FROM records
WHERE id IN (
SELECT MAX(id)
FROM records
GROUP BY location_id, date
)
ORDER BY location_id, product
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.