[英]MySQL select top n records per group nested
我正在嘗試從MySQL(版本:5.6.29和10.1.28-MariaDB)獲得前n行(目前為2行)。 我已經在SO或其他地方看到了簡單的示例( example1 , example2 ),問題是我的查詢更加復雜,而且似乎運行不佳。
我在圖表上看到了表格(為簡潔起見,刪除了一些字段):
每個Purchase_item可以是coupon,purchase_offer或subscription_plan(一個有效,而另外兩個為null)。 其中每個的subscription_days > 0
。
最內層的SELECT本身可以正常工作。 第二個SELECT不能按預期工作(即使我刪除了外部選擇),對於同一customer_uuid
, purchase_rank
也通常相同,就好像最里面的選擇沒有按customer_uuid排序一樣。
有任何想法嗎? 我讀到 ORDER BY在嵌套查詢中不能很好地工作,也許這就是我的問題? 那我該怎么做呢? 還是查詢優化器正在做一些奇怪的事情? 我嘗試用IF替換CASE,結果也一樣。 這是代碼:
SELECT
id,
uuid,
purchase_offer,
subscription_plan,
coupon,
customer_uuid,
payment_date,
subscription_days,
FROM
(SELECT
id,
uuid,
purchase_offer,
subscription_plan,
coupon,
customer_uuid,
payment_date,
subscription_days,
@purchase_rank := CASE @current_customer
WHEN customer_uuid THEN @purchase_rank + 1
ELSE 1
END AS purchase_rank,
@current_customer:= customer_uuid AS current_customer
FROM
(SELECT
pi.id,
pi.uuid,
pi.purchase_offer,
pi.subscription_plan,
pi.coupon,
pi.customer_uuid,
p.payment_date,
IFNULL(po.subscription_days, IFNULL(sp.subscription_days, cpo.subscription_days)) AS subscription_days
FROM
purchase_item pi
JOIN purchase p ON p.id = pi.purchase
LEFT JOIN purchase_offer po ON pi.purchase_offer = po.id
LEFT JOIN subscription_plan sp ON pi.subscription_plan = sp.id
LEFT JOIN coupon cp ON pi.coupon = cp.id
LEFT JOIN purchase_offer cpo ON cp.purchase_offer = cpo.id
WHERE
p.status = 'COMPLETED'
AND pi.customer_uuid IS NOT NULL
AND p.payment_date IS NOT NULL
AND (po.subscription_days > 0
OR sp.subscription_days > 0
OR cpo.subscription_days > 0)
ORDER BY pi.customer_uuid , p.payment_date DESC) AS temp)
AS pu
WHERE
pu.purchase_rank <= 2
ORDER BY pu.customer_uuid , pu.payment_date DESC
任何幫助將不勝感激。 提前致謝。
對於MySql查詢的這種限制,您可以在語句末尾簡單地添加LIMIT 0, 2
。
編輯我
例如:從語句獲取前n個結果:
SELECT * FROM purchase
ORDER BY payment_date ASC
LIMIT n
反過來:
SELECT * FROM purchase
ORDER BY payment_date DESC
LIMIT n
如果您知道要跳過查詢的前n個結果,則可以從給定的偏移量開始LIMIT
。 例如,我們要跳過前10個結果:
SELECT * FROM purchase
ORDER BY payment_date DESC
LIMIT 10, n
要回答我自己的問題:我找到了 。 即使在MySQL上,而不僅僅是MariaDB上,它似乎都可以正常工作。 嵌套查詢需要LIMIT <large number>
來創建臨時表。 因此Cataklysm的答案部分正確,但不適用於較小的數字(至少不是根據我的測試)。
這是代碼的更正部分:
...
ORDER BY pi.vehicle_uuid , p.payment_date DESC LIMIT 18446744073709551615) temp) pu
謝謝您的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.