首页 > 解决方案 > 排序 LEFT JOIN 选择查询

问题描述

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

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

图片:第 31 行的第 31 行正好是第一个显示行 ,但是当我将此查询放入 LEFT JOIN 查询时不起作用,第 25 行第 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

标签: mysqlsqlmysql-8.0

解决方案


当您将查询放入 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

推荐阅读