我有一张这样的表:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 | <- Duplicate record
| 12.15 | 4.55 | <- Duplicate record
| 12.15 | 4.55 | <- Duplicate record
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 | <- Duplicate record
| 31.2 | 65.1 | <- Duplicate record
| 9.4 | 7.8 |
| 12.15 | 4.55 | <- Same Duplicate record
| 12.15 | 4.55 | <- Same Duplicate record
| 12.15 | 4.55 | <- Same Duplicate record
| 31.2 | 65.1 | <- Same Duplicate record
| 31.2 | 65.1 | <- Same Duplicate record
我希望将A
和B
分组。但我想将串联值分组
因此,如果两个相同记录之间存在不同的记录,那么两个记录(相同)都应该来。
例如我的预期输出应该是:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 | <- Group 1
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 | <- Group 2
| 9.4 | 7.8 |
| 12.15 | 4.55 | <- Group 3 (Second Time)
| 31.2 | 65.1 | <- Group 4 (Second Time)
我正在尝试的是:
SELECT * FROM MyTable
GROUP BY A,B
但它给了我错误的结果:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 |
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 |
| 9.4 | 7.8 |
Here `12.15` and `31.2` is skipped second time. But I want it.
注意,我读了this question,但解决方案是用PHP提供的,而我想在MySQL中使用它 我正试图在this SQLFiddle中解决问题。
答案 0 :(得分:2)
您是否在列上有顺序ID?如果是这样,您可以尝试类似:
SELECT t.A, t.B
FROM myTable t
WHERE NOT EXISTS
(
SELECT 1
FROM myTable t2
WHERE t2.A = t.A
AND t2.B = t.B
AND t2.Id = (SELECT MIN(t3.Id) FROM myTable t3 WHERE t3.Id > t.Id)
)
如果您没有身份证,可以尝试以下方法,但请记住,不能保证您会得到您想要的结果;除非您通过以下方式指定要排序的列,否则服务器可以按照任何顺序返回结果:
SELECT t.A, t.B
FROM
(
SELECT @curRow := @curRow + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow := 0) r ON 1=1
) t
WHERE NOT EXISTS
(
SELECT 1
FROM (
SELECT @curRow2 := @curRow2 + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow2 := 0) r ON 1=1
) t2
WHERE t2.A = t.A
AND t2.B = t.B
AND t2.Id = (
SELECT MIN(t3.Id)
FROM (
SELECT @curRow3 := @curRow3 + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow3 := 0) r ON 1=1
) t3
WHERE t3.Id > t.Id
)
)