[英]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.