5

假设我有一个 MySQL 表:

╔══════╦═════╦═════════╦═════════╗
║ 时间 ║ 中 ║ field_1 ║ field_2 ║
╠══════╬═════╬═════════╬═════════╣
║ 100 ║ 1 ║ 32 ║ 54 ║
║ 100 ║ 2 ║ 0 ║ 34 ║
║ 100 ║ 3 ║ 44 ║ 99 ║
║ 200 ║ 1 ║ 0 ║ 45 ║
║ 200 ║ 2 ║ 0 ║ 45 ║
║ 200 ║ 3 ║ 4 ║ 59 ║
║ 200 ║ 4 ║ 45 ║ 45 ║
╚══════╩═════╩═════════╩═════════╝

time 是一个 UNIX 时间戳。mid 是成员ID。field_1 由成员提供。field_2 会自动填充。

我希望为所有成员选择具有最新非零字段_1 的行。因此查询将导致:

╔══════╦═════╦═════════╦═════════╗
║ 时间 ║ 中 ║ field_1 ║ field_2 ║
╠══════╬═════╬═════════╬═════════╣
║ 100 ║ 1 ║ 32 ║ 54 ║
║ 200 ║ 3 ║ 4 ║ 59 ║
║ 200 ║ 4 ║ 45 ║ 45 ║
╚══════╩═════╩═════════╩═════════╝

我想出的唯一解决方案似乎不是很优雅:

选择 *
从 (
    选择 *
    从 t1
    WHERE field_1 > 0
    按时间顺序排列
) 作为一个
按中间分组

有没有更好的办法?

4

2 回答 2

4

这里的想法是创建一个子查询,它time为每个查询获取最大值mid并将其加入表本身。

SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT mid, MAX(time) maxV
FROM tableName
WHERE field_1 > 0
GROUP BY mid
) b ON a.mid = b.mid and
        a.time = b.maxV

SQLFiddle 演示

于 2012-10-26T14:56:21.837 回答
1
SELECT a.*
FROM t1 AS a
INNER JOIN
(
    SELECT mid, MAX(time) AS maxTime
    FROM t1
    WHERE field_1 <> 0
    GROUP BY mid
) b ON a.mid = b.mid AND a.time = b.maxTime

SQL小提琴

于 2012-10-26T14:59:57.560 回答