SQL Select 只有具有 Where 条件的列上具有最小值的行
SQL Select only rows with Minimum Value on a Column with Where Condition
Table:
| 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 |
如何 select 每个 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
您可以先选择未被拒绝的产品的最小订单索引,如下所示:
SELECT productId, MIN(orderIndex)
FROM myTable
WHERE rejected = 0
GROUP BY productId;
一旦你有了它,你可以将它与你原来的 table 结合起来,条件是 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 示例。
http://sqlfiddle.com/#!9/0196f/2
SELECT DISTINCT t.*
FROM table1 t
INNER JOIN (
SELECT productId, min(orderIndex) minIdx
FROM table1
WHERE rejected = 0
GROUP BY productId
) t1
ON t.productId = t1.productId
AND t.orderIndex = t1.minIdx;
Table:
| 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 |
如何 select 每个 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
您可以先选择未被拒绝的产品的最小订单索引,如下所示:
SELECT productId, MIN(orderIndex)
FROM myTable
WHERE rejected = 0
GROUP BY productId;
一旦你有了它,你可以将它与你原来的 table 结合起来,条件是 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 示例。
http://sqlfiddle.com/#!9/0196f/2
SELECT DISTINCT t.*
FROM table1 t
INNER JOIN (
SELECT productId, min(orderIndex) minIdx
FROM table1
WHERE rejected = 0
GROUP BY productId
) t1
ON t.productId = t1.productId
AND t.orderIndex = t1.minIdx;