排序 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
)。
我有两个 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
)。