我有一个如下表:
tmp_id | 产品可用性(0 和 1) | is_available(0 和 1) | stock_count(整数) | product_id(整数) |
---|---|---|---|---|
1 | 1 | 1 | 0 | 1 |
2 | 1 | 1 | 4 | 1 |
我需要为每个 product_id
获取第一个可用产品。
可用产品必须首先检查product_availability
,然后检查is_available
,最后检查stock_count
。 (当 product_availability
为 1
时,产品可用,然后 is_available
为 1
并且库存中至少有一种产品1
。)
我想先展示可用的产品,如果没有可用的产品,则显示哪个产品并不重要(在不可用的情况下,第一个产品也可以)。
(在上面的示例中,我需要先获取 tmp_id
为 2
的产品。)
问题: 我的问题是如何编写 MYSQL 查询来实现我的需求?
我可以使用以下命令按所需顺序获取我的产品,但我不知道下一步该怎么做才能使用 GROUP BY
获取第一个现有产品:
SELECT pa.* FROM `product_advanced` AS `pa` ORDER BY `pa`.`product_availability` DESC, `pa`.`is_available` DESC, `pa`.`stock_count` DESC
注意:当然,这只是我所拥有的内容的简单演示,实际代码更为复杂,并且具有多个联接和其他内容。
P粉0557261462023-09-13 14:05:48
这可以使用 row_number()
来完成,返回分区内每行的唯一行号
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY product_availability DESC, is_available DESC, stock_count DESC) AS rn FROM product_advanced ) SELECT tmp_id, product_availability, is_available, stock_count, product_id FROM cte WHERE rn = 1;