>我有一个表格,里面有库存的产品尺寸。
我希望所有尺寸的product_id
都列在顶部,然后其他所有内容都应列在下面。
我的桌子:
Id product_id product_name size stock
1 1 XYZ S 2
2 1 XYZ M 0
3 1 XYZ L 3
8 1 XYZ XL 3
----------------------------------------------------
4 2 ABC S 1
5 2 ABC M 1
6 2 ABC L 1
我有 2 种产品:ABC
和XYZ
。
您会看到,对于产品ABC
,库存有所有 3 种尺寸(S、M、L),但产品XYZ
只有 2 种尺寸可用(S、L)。
我希望产品ABC
移动到列表顶部,而其余部分向下移动。
我的预期输出是:
product_id product_name
2 ABC
1 XYZ
到目前为止,我已经尝试了这个查询:
select product_id, product_name from product_attributes group by product_id
注意:- 尺寸值的数量可以增加(例如 XL),但我只想检查这些尺寸(S,M,L)
您可以通过比较产品的总行数 (COUNT(*)
) 与那些行的行数 (stock
> 0 (SUM(stock > 0)
) 来确定哪些产品具有所有尺寸。在MySQL中,我们可以将该比较视为整数,并将其用于ORDER BY
子句中:
SELECT product_id, product_name
FROM product_attributes
WHERE size in ('S', 'M', 'L')
GROUP BY product_id, product_name
ORDER BY COUNT(*) = SUM(stock > 0) DESC
输出:
product_id product_name
2 ABC
1 XYZ
在 dbfiddle 上演示
我希望产品ABC移动到列表顶部,而其余部分向下移动。
和
注意:- 是的,尺寸可以增加,但我只想检查这些尺寸(S,M,L)
您可以使用order by count(case when stock <> 0 then 1 end)
+where size in ('S','M','L')
select product_id, product_name
from product_attributes
where size in ('S','M','L')
group by product_id,product_name
order by count(case when stock <> 0 then 1 end) desc
演示链接 MySQL 8.0 | db<>fiddle
如果您按产品分组,那么在ORDER BY
子句中您所需要的只是:
ORDER BY SUM(stock = 0) > 0
表达式stock = 0
的计算结果为1
如果没有可用于尺寸"S"、"M"或"L"的库存,因此在这种情况下,SUM()
将返回一个正数,SUM(stock = 0) > 0
将计算为在产品没有行stock = 0
之后对产品进行1
排序:
SELECT product_id, product_name
FROM product_attributes
WHERE size in ('S', 'M', 'L')
GROUP BY product_id, product_name
ORDER BY SUM(stock = 0) > 0
显然,这是一个对所需大小进行过滤的group by
:
SELECT product_id, product_name
FROM product_attributes
WHERE size IN ('S', 'M', 'L')
GROUP BY product_id, product_name
然后你想要一个ORDER BY
. 目前还不清楚你是否真的想要:
ORDER BY SUM(stock > 0) = 3 DESC
或:
ORDER BY SUM(stock = 0) ASC
或:
ORDER BY SUM(stock <> 0) DESC
第一个保证所有三个大小都存在(假设没有重复项),并且所有三个大小的值都大于0
instock
。
第二个顺序按0
的行数排序。 因此,那些在stock
列中没有0
的产品将是第一个,其余的将以此类推。
按计数的第三个顺序stock
在降序模式下不为零。
如果您有这样的数据,差异将很明显:
21 1 DEF S 2
22 1 DEF L 5
据推测,DEF
没有尺寸M
. 是否要在结果集中使用它? 算不算全部有货?