2016-09-23 137 views
1

我想要结合GROUP BY,ORDER BYHAVING来获取记录,但我没有得到结果/可取的结果。这是我的表test使用GROUP BY,ORDER BY和HAVING得不到结果

+--------------------------------------+-----+---------------------+------+ 
| id         | no | date_entered  | name | 
+--------------------------------------+-----+----------------------------+ 
| c44d1977-0193-a2f1-00f9-57e4c53ba416 | 104 | 2016-09-23 06:02:16 | Z-44 | 
| ca1879a2-df08-4fe3-b144-57e4d2ab0c62 | 104 | 2016-09-23 06:57:35 | Z-44 | 
| 5dd46d35-358a-314e-30fa-57e4d2ca92ad | 104 | 2016-09-23 06:59:17 | Z-44 | 
| d474cc6a-e7a1-15d1-d209-57e4c5aa607d | 105 | 2016-09-23 05:03:08 | Z-45 | 
| db77b687-763d-b63a-be77-57e4d2e246fb | 105 | 2016-09-23 05:51:41 | Z-45 | 
| 70f0f514-c0fd-ddfd-55a6-57e4d21b5e3c | 106 | 2016-09-23 05:29:39 | Z-46 | 
+--------------------------------------+-----+---------------------+------+ 

而且我想结果是这样的:

+--------------------------------------+-----+----------+ 
| id         | no | COUNT(*) | 
+--------------------------------------+-----+----------+ 
| 5dd46d35-358a-314e-30fa-57e4d2ca92ad | 104 |  3 | 
| db77b687-763d-b63a-be77-57e4d2e246fb | 105 |  3 | 
+--------------------------------------+-----+----------+ 

在这里,我想只获取那些属于同一no且历史最悠久的一个记录。此外,此查询应该在有多个记录属于同一个no的情况下运行。所以这是我使用

SELECT id, no, COUNT(*) 
FROM test 
GROUP BY no 
HAVING COUNT(*) > 1 
ORDER BY date_entered DESC; 

查询,但我得到这个结果

+--------------------------------------+-----+----------+ 
| id         | no | COUNT(*) | 
+--------------------------------------+-----+----------+ 
| c44d1977-0193-a2f1-00f9-57e4c53ba416 | 104 |  3 | 
| d474cc6a-e7a1-15d1-d209-57e4c5aa607d | 105 |  3 | 
+--------------------------------------+-----+----------+ 

现在,我到处寻找帮助,我得到这个How to combine GROUP BY, ORDER BY and HAVING并作为公认的答案提到However, you need to pick the fields you ACTUALLY WANT then select only those and group by them,所以我也试过这个查询:

SELECT id, no, count(*) 
FROM test 
GROUP BY id, no 
HAVING count(*) > 1 
ORDER BY date_entered DESC; 

但执行此查询后,我没有。请在这里指导我。

回答

2

一种方法是使用substring_index()/group_concat()招:

SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY date_entered DESC), ',', 1) as id, 
     no, COUNT(*) 
FROM test 
GROUP BY no 
HAVING COUNT(*) > 1 ; 

有这种方法的一些限制。 GROUP_CONCAT()的默认内部大小为1,024字节。这很容易重新配置,但它假定您没有太多的给定数字的ID。

还有其他方法,使用变量或更复杂的SQL语句。但是,这是适合当前查询的最简单方法。

+0

Thanks @Gorden,它工作。但是对于给定的数字,将会有许多ID,并且如您所述,需要重新配置GROUP_CONCAT()的内部大小。我可否知道,会有什么并发症?另外,如果你稍微解释一下你的查询,主要是'substring_index()/ group_concat()',那对我来说会很有帮助。谢谢。 –

+1

'group_concat()'在日期之前把所有的id都变成一个长字符串顺序。 'substring_index()'拉出第一个。 –

+0

嘿@GordonLinoff,你有什么想法如何将此查询移植到SQL SERVER 2008? –