Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:获取每个分组的最新条目以及每个分组中的条目数_Mysql_Sql_Count_Group By_Greatest N Per Group - Fatal编程技术网

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