SQL根据给定字段仅选择第一个匹配项
问题描述:
编辑:根据@MostyMostacho在下面的注释中的说明,这不能用普通SQL来完成。我会保持打开的问题,以防万一它对其他人有用。SQL根据给定字段仅选择第一个匹配项
我有这个表:
+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 1 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+
| 3 | P |
+---+---+
| 4 | P |
+---+---+
| 1 | P |
+---+---+
| 5 | P |
+---+---+
| 6 | P |
+---+---+
| 7 | P |
+---+---+
而且我想这样的结果:
+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+
我想保持的a
第一次出现,并丢弃后续行。
我应该执行哪些查询以达到目的?我的SQL技能正在生锈......
答
没有特定的时间戳或以其他方式单调递增的id列,没有办法查询表中的行插入的顺序;数据库引擎可以*地在它为所欲为任意顺序,这可能不是在该行中去的顺序返回行。
因此,你有什么建议实际上是与表架构最RDBMS不可能你提供了。
是你下面的表有,但是:
+-------+-------+-------+ | id | A | B | +-------+-------+-------+ | 1 | 1 | z | | 2 | 1 | y | | 3 | 1 | x | | 4 | 2 | y | | 5 | 2 | x | | 6 | 3 | x | +-------+-------+-------+
你可以这样做:
SELECT a.A, a.B
FROM Table1 a
INNER JOIN (
SELECT MIN(id) id
FROM Table1
GROUP BY A
) b ON b.id = a.id
答
SELECT a.A, a.B
FROM (select @rownum:[email protected]+1 as id, a, b FROM table, (SELECT @rownum:=0) r ) a
INNER JOIN (
SELECT MIN(id) id
FROM (select @rownum:[email protected]+1 as id, a, b FROM table, (SELECT @rownum:=0) r )
GROUP BY A
) b ON b.id = a.id
答
试试这个:
SELECT T1.*
FROM myTable T1
WHERE NOT EXISTS(
SELECT 'NEXT'
FROM myTable T2
WHERE T2.a = T1.a
AND T2.b > T1.a
)
NOT EXISTS子查询得到的只是最后,我想你的顺序是由B列
在这方面应该定义“第一”的ASC值条件。除非应用了某种类型的ORDER BY,否则不保证从MySQL返回数据集时的行排序。 –
正如我在第二个注释中所写的那样,表格实际上是有序的。 – Carlos
订单是否受到排列B的排列位置的限制? –