社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

user • 5 年前 • 1638 次点击  

我有一张桌子有产品尺寸和库存。
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
 
1638 次点击  
文章 [ 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