簡體   English   中英

排序 LEFT JOIN 選擇查詢

[英]sorting LEFT JOIN Select query

我有兩個表(products & products_price)我想對產品價格行進行排序以在左連接查詢中顯示為默認價格

例如:product id = 14 是兩個價格項目(products_price 表中的 num 31,25)

這個單一的查詢結果,完美顯示就是我想要的:

SELECT  id ,p_id ,qty,price,CEILING(price-(price*discount_percent / 100)) AS off_price, CASE qty=0 WHEN 0 THEN 1 ELSE 0 END as not_zero_qty 
FROM products_price
WHERE status=1 AND p_id=14
ORDER BY not_zero_qty DESC,off_price ASC

圖像:行 id #31 正好用於第一個顯示行,但是當我將此查詢放在 LEFT JOIN 查詢中時不起作用,而行 id #25 是要顯示的第一行:(

我的 LEFT JOIN 查詢和結果是:圖像:查詢結果

SELECT p.id,p.title,pp.price_id,pp.off_price
FROM products p
LEFT JOIN (
SELECT  id as price_id ,p_id ,discount_percent,qty,price,default_price,CEILING(price-(price*discount_percent / 100)) AS off_price, CASE qty=0 WHEN 0 THEN 1 ELSE 0 END as not_zero_qty 
FROM products_price
WHERE status=1 
ORDER BY not_zero_qty DESC,off_price ASC ) pp 
ON p.id=pp.p_id 
WHERE  p.status=1
GROUP BY p.id
ORDER BY pp.off_price DESC

當您將查詢放入 LEFT JOIN 子查詢時,除非指定了 LIMIT,否則 SORT BY 沒有任何意義。 嘗試將 ORDER BY 移到外層,有點

SELECT p.id,p.title,pp.price_id,pp.off_price
     , pp.not_zero_qty 
FROM products p
LEFT JOIN (  
    SELECT  id as price_id ,p_id ,discount_percent,qty,price,default_price,CEILING(price-(price*discount_percent / 100)) AS off_price, CASE qty=0 WHEN 0 THEN 1 ELSE 0 END as not_zero_qty 
    FROM products_price
    WHERE status=1 
    GROUP BY price_id
    ) pp 
ON p.id=pp.p_id 
WHERE  p.status=1
GROUP BY p.id
ORDER BY not_zero_qty DESC, pp.off_price DESC

我重寫了查詢並將 LIMIT 設置為 LEFT JOIN Select

SELECT
    p.id,
    p.title,
    pp.price_id,
    pp.off_price,
    pp.not_zero_qty
FROM
    products p
LEFT JOIN(SELECT
        id AS price_id,
        p_id,discount_percent,qty,price,
        CEILING(price -(price * discount_percent / 100)) AS off_price,
CASE qty = 0 WHEN 0 THEN 1 ELSE 0 END AS not_zero_qty
FROM
    products_price
WHERE status= 1  ORDER BY not_zero_qty DESC,off_price ASC LIMIT 1 ) pp
ON p.id = pp.p_id
WHERE p.status = 1
GROUP BY p.id 
ORDER BY pp.off_price DESC

但是結果,它的第一個產品行是 products_price 的數據:上傳的圖片,如果將 LIMIT 增加到 2 結果是:上傳的圖片

如果我從語句中刪除 LIMIT 1,那么它會返回多個結果:上傳的圖片

例如,單個查詢中的產品 ID 12 返回:上傳的圖片

您想要每件產品的最低價格。 我看到你是外聯價格,所以價格表中有沒有條目的產品,你仍然想展示這些產品。 您還在查詢中考慮數量為 0,因此您更喜歡另一行,並且只顯示零金額的價格,以防表中沒有產品的非零金額條目。

為此,您有一個ORDER BY子句,您想用它對每個產品的價格進行排名,並且只顯示排名最高的價格(通常是高於零的最低價格)。

這通常是通過橫向連接完成的,但 MySQL 尚不支持。 在 MySQL 中,您可以使用ROW_NUMBER來對行進行排名:

SELECT p.id, p.title, pp.price_id, pp.off_price
FROM products p
LEFT JOIN
(
  SELECT  
    id AS price_id,
    p_id,
    discount_percent,
    qty,
    price,
    default_price,
    CEILING(price - (price * discount_percent / 100)) AS off_price,
    ROW_NUMBER() OVER (PARTITION BY p_id
                       ORDER BY (qty = 0),
                                CEILING(price - (price * discount_percent / 100))) AS rn
  FROM products_price
  WHERE status = 1 
) pp ON pp.p_id = p.id AND pp.rn = 1
WHERE p.status = 1
ORDER BY pp.off_price DESC;

說明:使用ROW_NUMBER您可以根據所需的順序對每個產品的價格行進行編號。 然后,您只保留產品排名最高的價格行 ( rn = 1 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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