Py学习  »  DATABASE

如何使用mysql获取各种大小的可用性最高的记录

user • 5 年前 • 1859 次点击  

我有一张桌子有产品尺寸和库存。
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

ABC XYZ .
你看这个产品 基础知识 ,所有3种尺寸(S、M、L)都有库存,但产品 XYZ公司
我要这个产品 基础知识 移动到列表的顶部,其余的则向下移动。

我的预期产出是:

product_id   product_name
   2             ABC
   1             XYZ

我已经试过这个问题了:

select product_id, product_name from product_attributes group by product_id

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56857
文章 [ 4 ]  |  最新文章 5 年前
Gordon Linoff
Reply   •   1 楼
Gordon Linoff    5 年前

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 在里面 stock .

按行数的第二个顺序 0个 0个 s在 列将排在第一位,其余的依次类推。

三等兵 在递减模式中不是零。

如果你有这样的数据,区别会很明显:

21      1            DEF         S      2
22      1            DEF         L      5

大概没有尺寸 M DEF . 你想在结果集中看到吗?这算不算全部库存?

forpas
Reply   •   2 楼
forpas    5 年前

如果按产品分组,则在 ORDER BY 条款你只需要:

ORDER BY SUM(stock = 0) > 0

stock = 0 评估为 1 如果没有一种尺码的“S”、“M”或“L”的存货,那么在这种情况下 SUM() 将返回正数并 SUM(stock = 0) > 0 将评估为 在没有行的产品之后对产品进行排序 库存=0 :

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
Wei
Reply   •   3 楼
Wei    5 年前

我希望产品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

Demo Link MySQL 8.0 | db<>fiddle

Nick
Reply   •   4 楼
Nick    5 年前

你可以确定哪些产品 全部的 COUNT(*) )与那些排 stock >0个( SUM(stock > 0) 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

Demo on dbfiddle