簡體   English   中英

MySQL選擇每組嵌套的前n條記錄

[英]MySQL select top n records per group nested

我正在嘗試從MySQL(版本:5.6.29和10.1.28-MariaDB)獲得前n行(目前為2行)。 我已經在SO或其他地方看到了簡單的示例( example1example2 ),問題是我的查詢更加復雜,而且似乎運行不佳。

我在圖表上看到了表格(為簡潔起見,刪除了一些字段):

能源效率

每個Purchase_item可以是coupon,purchase_offer或subscription_plan(一個有效,而另外兩個為null)。 其中每個的subscription_days > 0

最內層的SELECT本身可以正常工作。 第二個SELECT不能按預期工作(即使我刪除了外部選擇),對於同一customer_uuidpurchase_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM