0

我尝试过的以及返回的数据不正确:

SELECT type, pid, MAX(distance) FROM table GROUP BY type

这将从我的数据库中检索每个唯一type且正确的对应最大值(总共有 26 个不同的唯一值,这永远不会改变),但值不正确。如何检索正确和对应的值?distancetypetypepidpid

示例表数据:

pid  | type | distance  | ...
675  | dcj  | 273060192 | ...
743  | mcj  | 273046176 | ...
284  | dcj  | 271592224 | ...
4091 | lj   | 255217488 | ...
743  | lj   | 255170160 | ...
4091 | lj   | 230840928 | ...

应该返回什么:

pid  | type | distance
675  | dcj  | 273060192
743  | mcj  | 273046176
4091 | lj   | 255217488

关于数据的一些值得注意的信息:每个pid值有多个条目,每个值可能有多个pid具有相同type值的条目。

我是否需要使用 PHP 运行两个不同的查询,其中第一个查询type通过 26 个不同的值GROUP BY type,第二个查询执行 26 次不同的时间(每个唯一值一次)并通过类似的东西type找到每个查询的最大值?或者这可以在一个 SQL 查询中完成吗?typeWHERE type="' . $type . '" ORDER BY distance DESC LIMIT 1

4

3 回答 3

2

这个查询给出了想要的结果。

SELECT t.type, t.pid, t.distance
FROM table t
INNER JOIN (SELECT type, MAX(distance) as distance FROM table GROUP BY type) as m
ON t.type = m.type and t.distance = m.distance
ORDER BY t.type

对于两个或多个 pid 具有相同最大距离的(不太可能)情况,它将返回所有具有相同最大距离的 pid。

于 2013-11-06T16:32:56.327 回答
1

您可以进行GROUP BY查询,他们将其加入原始表以获得正确的pid,如下所示:

SELECT x.type, t.pid, x.max_dist
FROM (
    SELECT type, MAX(distance) as max_dist FROM table GROUP BY type
) as x
JOIN table t ON x.max_dist=t.distance AND x.type=t.type

sqlfiddle 上的演示

于 2013-11-06T16:31:13.727 回答
0

这也可以使用公用表表达式:

;
WITH    cte
          AS ( SELECT   pid,
                        type,
                        distance,
                        ROW_NUMBER() OVER ( PARTITION BY pid ORDER BY distance DESC ) AS RowNum
               FROM     table_name
             )
    SELECT  pid,
            type,
            distance
    FROM    cte
    WHERE   RowNum = 1
于 2013-11-06T16:51:04.497 回答