在Mysql中按count列选择非group

时间:2016-04-02 16:44:15

标签: mysql

我有一个包含三列的表tbl:

id | fk | dateof
 1 |  1 | 2016-01-01
 2 |  1 | 2016-01-02
 3 |  2 | 2016-02-01
 4 |  2 | 2016-03-01
 5 |  3 | 2016-04-01

我想得到像这样的结果

Id    count of Id         max(dateof)
2    | 2                | 2016-01-02
4    | 2                | 2016-03-01
5    | 1                | 2016-04-01

我的尝试

SELECT id,tbl.dateof dateof
FROM tbl 
INNER JOIN
 (SELECT fk, MAX(dateof) dateof ,
  count(id) cnt_of_id -- How to get this count value in the result
  FROM tbl 
  GROUP BY fk) temp
ON tbl.fk = temp.fk AND tbl.dateof = temp.dateof

2 个答案:

答案 0 :(得分:1)

这是一个聚合查询,但您似乎不希望聚合列。没关系(尽管你无法区分定义每一行的rk):

select count(*) as CountOfId, max(dateof) as maxdateof
from t
group by fk;

换句话说,您的子查询几乎就是您所需要的。

如果您有合理数量的数据,可以使用MySQL技巧:

select substring_index(group_concat(id order by dateof desc), ',', 1) as id
       count(*) as CountOfId, max(dateof) as maxdateof
from t
group by fk;

注意:这受到group_concat()的最大中间大小的限制。此参数可以更改,并且通常足够大,适用于中等大小的表上的此类查询。

答案 1 :(得分:0)

您显然希望每个fk有一个结果行,因此按其分组。然后,您需要每个fk的最大ID,行数和最大日期:

select 
  max(id) as max_id, 
  count(*) as cnt,
  max(date_of) as max_date_of
from tbl 
group by fk;