首页  >  问答  >  正文

如何使用“group by”和“order by”从表中获取特定行

我有一个如下表:

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_availability1 时,产品可用,然后 is_available1 并且库存中至少有一种产品1。)

我想先展示可用的产品,如果没有可用的产品,则显示哪个产品并不重要(在不可用的情况下,第一个产品也可以)。

(在上面的示例中,我需要先获取 tmp_id2 的产品。)

问题: 我的问题是如何编写 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粉794851975P粉794851975381 天前384

全部回复(1)我来回复

  • P粉055726146

    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;

    回复
    0
  • 取消回复