如果不为空,Mysql按base_price或discount_value排序

标签 mysql database sorting

我想按价格对数据进行排序。但我有两列数据表,即base_price 和discount_value。我想通过比较是否有折扣值来排序,值(value)小的将被排序。但在这个问题中我只能根据discount_value或base_price排序,不能将两者结合起来。有办法克服吗?

查询:

select `p`.`id`, `p`.`name`, `p`.`product_code`, `p`.`base_price`, `pd`.`discount_value`, `p`.`weight`, `c`.`category`, pc.id as product_color_id, `pc`.`base_color`, `i`.`image`, sum(ps.stock) as stock, `p`.`status` from `products` as `p` 
left join `category_product` as `cp` on `p`.`id` = `cp`.`product_id` 
left join `categories` as `c` on `cp`.`category_id` = `c`.`id` 
left join `product_colors` as `pc` on `p`.`id` = `pc`.`product_id` 
left join `image_product_color` as `ipc` on `ipc`.`id` = (select ipc1.id from image_product_color as ipc1 where pc.id = ipc1.product_color_id order by ipc1.id desc limit 1) 
left join `images` as `i` on `i`.`id` = (select i1.id from images as i1 where ipc.image_id = i1.id order by i1.id desc limit 1) 
left join `product_sizes` as `ps` on `pc`.`id` = `ps`.`product_color_id` 
left join `product_discounts` as `pd` on `pd`.`id` = (select pd1.id from product_discounts as pd1 where p.id = pd1.product_id and date(now()) <= pd1.valid_until) 
group by `p`.`id`, `p`.`name`, `p`.`product_code`, `p`.`base_price`, `pd`.`discount_value`, `p`.`weight`, `c`.`category`, `pc`.`id`, `pc`.`base_color`, `i`.`image`, `p`.`status` 
order by CASE WHEN pd.discount_value = null THEN p.base_price ELSE pd.discount_value END ASC

结果:

Result

最佳答案

将 ORDER BY 子句更改为以下内容:

ORDER BY IFNULL(pd.discount_value, p.base_price) ASC

修改后的查询如下所示:

select `p`.`id`, `p`.`name`, `p`.`product_code`, `p`.`base_price`, `pd`.`discount_value`, `p`.`weight`, `c`.`category`, pc.id as product_color_id, `pc`.`base_color`, `i`.`image`, sum(ps.stock) as stock, `p`.`status` from `products` as `p` 
left join `category_product` as `cp` on `p`.`id` = `cp`.`product_id` 
left join `categories` as `c` on `cp`.`category_id` = `c`.`id` 
left join `product_colors` as `pc` on `p`.`id` = `pc`.`product_id` 
left join `image_product_color` as `ipc` on `ipc`.`id` = (select ipc1.id from image_product_color as ipc1 where pc.id = ipc1.product_color_id order by ipc1.id desc limit 1) 
left join `images` as `i` on `i`.`id` = (select i1.id from images as i1 where ipc.image_id = i1.id order by i1.id desc limit 1) 
left join `product_sizes` as `ps` on `pc`.`id` = `ps`.`product_color_id` 
left join `product_discounts` as `pd` on `pd`.`id` = (select pd1.id from product_discounts as pd1 where p.id = pd1.product_id and date(now()) <= pd1.valid_until) 
group by `p`.`id`, `p`.`name`, `p`.`product_code`, `p`.`base_price`, `pd`.`discount_value`, `p`.`weight`, `c`.`category`, `pc`.`id`, `pc`.`base_color`, `i`.`image`, `p`.`status` 
ORDER BY IFNULL(pd.discount_value, p.base_price) ASC;

关于如果不为空,Mysql按base_price或discount_value排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136085/

相关文章:

mysql - 用于获取 MySql 表行的事件处理程序

database - Postgres : Surprising performance on updates using cursor

php - 通过php在mysql中选择行作为列

php - MySQL 左连接查询具有相同值的问题

PHP JSON 计算同一数组中的值

arrays - 如何判断 Int 数组是否按降序排序?不要使用额外的内存

php - Piwigo - 按 Piwigo 管理员中设置的顺序对网站上的相册进行排序

c - 使用 scandir 并按大小排序

mysql - 如何检查我的 mysql 数据库中当前正在运行的查询?

sql - 将查询与 SQL 中的正则表达式匹配?