我需要首先显示按销售排序的零件(列名为sales_rotation_group),并显示在末尾没有图像和参数的零件。换句话说,首先显示具有图像和参数的部分,然后显示没有图像和参数的部分
让我们假设db结构如下:
零件
id (字符串)、sales_rotation_group (字符串)、parameters_count (整数)
美术馆
id (整数) part_id (整数)
图片
id (整数),galery_id (整数)
目前我有这个SQL,但是它不能正确地对各个部分进行排序。它显示了一些带有图像的零件和几个带有参数的零件,然后是没有参数的零件,然后是带有参数的零件。
SELECT parts.* FROM parts
LEFT OUTER JOIN galleries
ON galleries.part_id = parts.id
LEFT OUTER JOIN images ON images.gallery_id = galleries.id
GROUP BY parts.id
ORDER BY parts.sale_rotation_group DESC, COUNT(images.id) DESC, parts.parameters_count DESC
我应该以某种方式使用分组吗?我想我可能会遇到这样的问题,一个零件可能有很好的销售(在查询结果的顶部),并且没有图像或参数。
发布于 2019-11-09 23:00:01
您可以更改ORDER BY
子句,以便根据计数是否大于0而不是实际计数值进行排序。这将确保具有0个图像和0个参数的零件在末尾排序:
ORDER BY CASE WHEN COUNT(images.id) > 0 THEN 0 ELSE 1 END,
CASE WHEN parts.parameters_count > 0 THEN 0 ELSE 1 END,
parts.sale_rotation_group DESC
注意,使用UNION
不会有什么帮助,因为UNION
查询的输出顺序是未定义的,并且您仍然需要ORDER BY
子句。
发布于 2019-11-09 23:05:28
您可以使用ORDER BY
中的窗口函数来完成所需的操作:
SELECT p.*
FROM parts p LEFT OUTER JOIN
galleries g
ON g.part_id = p.id LEFT OUTER JOIN
images i
ON i.gallery_id = g.id
GROUP BY p.id
ORDER BY COUNT(i.id) OVER (PARTITION BY p.id) DESC,
p.parameters_count DESC;
您可以包含p.sale_rotation_group
作为第一个键。但是,这不是您对所需排序的描述的一部分。
https://stackoverflow.com/questions/58784253
复制相似问题