排序 LEFT JOIN Select 查询

sorting LEFT JOIN Select query

我有两个 table(产品和 products_price) 我想对产品价格行进行排序以在左连接查询中显示为默认价格

例如:产品 id = 14 是两个价格项目(products_price table 中的编号 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

image : row id #31 is exactly for first show row 但是当我将此查询放在 LEFT JOIN 查询中时不起作用并且行 ID #25 是要显示的第一行:(

我的 LEFT JOIN 查询和结果是: image : query result

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 子查询时,SORT BY 没有意义,除非指定了 LIMIT。尝试将 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

您想要每件产品的最低价格。我看到你是外部加入价格,所以有些产品没有在价格 table 中输入,你仍然想显示这些产品。您还在考虑查询中的数量为 0,这样您会更喜欢另一行,并且只显示零数量的价格,以防 table 中的产品没有非零数量的条目。

为此,您有一个 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)。