table :

| id | productId | orderIndex |拒绝|
------------------------------------------
| 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 |拒绝|
------------------------------------------
| 2 | 1 | 1 | 0 |
| 4 | 2 | 0 | 0 |
| 6 | 3 | 0 | 0 |

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

SELECT id,productId,min(orderIndex)
从表
拒绝的地方= 0
按产品编号分组

这个也不起作用:

SELECT id,productId,min(orderIndex)
从 (
SELECT ID,ProductId,OrderIndex
从表
拒绝的地方= 0
)吨
按产品编号分组

最佳答案

您可以从选择不被拒绝的产品的最小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示例。

10-08 11:11