Mysql SQL:获取每个分组的最新条目以及每个分组中的条目数
假设我有下表:Mysql SQL:获取每个分组的最新条目以及每个分组中的条目数,mysql,sql,count,group-by,greatest-n-per-group,Mysql,Sql,Count,Group By,Greatest N Per Group,假设我有下表: some_table id relid upid downid sent text 1 1 1 1 2014-09-13 12:23:11 sometext bla 2 1 1 2 2014-10-08 14:15:09 othertext 3 3 2 4 2014-10-08 20:34:57 foo 4 2 1
some_table
id relid upid downid sent text
1 1 1 1 2014-09-13 12:23:11 sometext bla
2 1 1 2 2014-10-08 14:15:09 othertext
3 3 2 4 2014-10-08 20:34:57 foo
4 2 1 1 2014-10-09 04:14:15 bla
5 1 1 1 2014-10-15 17:24:15 more text
到目前为止,以下命令
SELECT
p1.relid AS relid,
p1.downid AS downid,
p1.sent AS last,
p1.`text` AS `text`
FROM
some_table AS p1
INNER JOIN (
SELECT
MAX(sent) AS MaxDate,
downid,
relid
FROM
some_table
WHERE
upid='1'
GROUP BY
downid,
relid
) AS p2
ON
p1.downid = p2.downid AND
p1.relid = p2.relid AND
p1.sent = p2.MaxDate
WHERE
p1.upid='1'
ORDER BY
`last` DESC
给我以下输出
relid downid last text
1 1 2014-10-15 17:24:15 more text
2 1 2014-10-09 04:14:15 bla
1 2 2014-10-08 14:15:09 othertext
正如所料。顺便说一句,我从stackoverflow的其他地方得到了这个解决方案
但是,我希望得到如下输出:
relid downid last text count
1 1 2014-10-15 17:24:15 more text 2
2 1 2014-10-09 04:14:15 bla 1
1 2 2014-10-08 14:15:09 othertext 1
其中count是按分组依据分组的行数
这有可能吗?如果有,怎么可能
另一种选择是有两张桌子
sometable1
id relid upid downid last
1 1 1 1 2014-10-15 17:24:15
2 1 1 2 2014-10-08 14:15:09
3 3 2 4 2014-10-08 20:34:57
4 2 1 1 2014-10-09 04:14:15
sometable2
id cid sent text
1 1 2014-09-13 12:23:11 sometext bla
2 2 2014-10-08 14:15:09 othertext
3 3 2014-10-08 20:34:57 foo
4 4 2014-10-09 04:14:15 bla
5 1 2014-10-15 17:24:15 more text
然后做一些类似的事情
SELECT
sometable1.id AS cid1,
sometable1.relid AS relid,
sometable1.downid AS downid,
sometable1.last AS last,
sometable2.text AS `text`,
COUNT(SELECT
id
FROM
sometable2
WHERE
sometable2.cid=cid1) AS `count`
FROM
sometable1
LEFT JOIN
sometable2
ON
sometable2.cid=sometable1.id AND
sometable2.sent=sometable1.last
ORDER BY
last DESC
除了明显产生语法错误外,您可以在子查询p2中添加一列,类似于COUNT*as CountOfRecords,然后您可以在外部查询中选择:
SELECT
p1.relid AS relid,
p1.downid AS downid,
p1.sent AS sent,
p1.`text` AS `text`,
p2.CountOfRecords
FROM
some_table AS p1
INNER JOIN (
SELECT
MAX(sent) AS MaxDate,
COUNT(*) AS CountOfRecords,
downid,
relid
FROM
some_table
WHERE
upid='1'
GROUP BY
downid,
relid
) AS p2
ON
p1.downid = p2.downid AND
p1.relid = p2.relid AND
p1.sent = p2.MaxDate
WHERE
p1.upid='1'
ORDER BY
`sent DESC