数据库
首页 > 数据库> > mysql-仅在条件条件列上选择具有最小值的行

mysql-仅在条件条件列上选择具有最小值的行

作者:互联网

表:

| id | productId | orderIndex | rejected |
------------------------------------------
| 1  |  1        |   0        |   1      |
| 2  |  1        |   1        |   0      |
| 3  |  1        |   2        |   0      |
| 4  |  2        |   0        |   0      |
| 5  |  2        |   1        |   1      |
| 6  |  3        |   0        |   0      |

如何为每个productId选择一行,其最小orderIndex不被拒绝?

预期结果:

| id | productId | orderIndex | rejected |
------------------------------------------
| 2  |  1        |   1        |   0      |
| 4  |  2        |   0        |   0      |
| 6  |  3        |   0        |   0      |

我尝试了此查询,但未收到正确的结果:

SELECT id, productId, min(orderIndex)
FROM table
WHERE rejected = 0
GROUP BY productId

这个也不起作用:

SELECT id, productId, min(orderIndex)
FROM (
    SELECT id, productId, orderIndex
    FROM table
    WHERE rejected = 0
) t
GROUP BY productId

解决方法:

您可以从选择不被拒绝的产品的最小orderIndex开始,如下所示:

SELECT productId, MIN(orderIndex)
FROM myTable
WHERE rejected = 0
GROUP BY productId;

一旦有了,就可以在productId和minOrderIndex匹配的条件下将其与原始表连接:

SELECT m.id, m.productId, m.orderIndex
FROM myTable m
JOIN(
  SELECT productId, MIN(orderIndex) AS minOrderIndex
  FROM myTable
  WHERE rejected = 0
  GROUP BY productId) tmp ON tmp.productId = m.productId AND tmp.minOrderIndex = m.orderIndex;

我的查询假设没有重复的(productId,orderIndex)对.只要那些不存在,就可以正常工作.这是一个SQL Fiddle示例.

标签:mysql,greatest-n-per-group
来源: https://codeday.me/bug/20191010/1888122.html