如何使用mysql获得所有大小的可用性的记录



>我有一个表格,里面有库存的产品尺寸。
我希望所有尺寸的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 种产品:ABCXYZ
您会看到,对于产品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

第一个保证所有三个大小都存在(假设没有重复项),并且所有三个大小的值都大于0instock

第二个顺序按0的行数排序。 因此,那些在stock列中没有0的产品将是第一个,其余的将以此类推。

按计数的第三个顺序stock在降序模式下不为零。

如果您有这样的数据,差异将很明显:

21      1            DEF         S      2
22      1            DEF         L      5

据推测,DEF没有尺寸M. 是否要在结果集中使用它? 算不算全部有货?

最新更新