假设我有一个MySQL表:
╔══════╦═════╦═════════╦═════════╗ ║ time ║ mid ║ 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 ║ ╚══════╩═════╩═════════╩═════════╝
时间是UNIX时间戳。 mid是会员ID。 field_1由会员提供。 field_2会自动填充。
我希望为所有成员选择具有最近非零field_1的行。因此查询将导致:
╔══════╦═════╦═════════╦═════════╗ ║ time ║ mid ║ field_1 ║ field_2 ║ ╠══════╬═════╬═════════╬═════════╣ ║ 100 ║ 1 ║ 32 ║ 54 ║ ║ 200 ║ 3 ║ 4 ║ 59 ║ ║ 200 ║ 4 ║ 45 ║ 45 ║ ╚══════╩═════╩═════════╩═════════╝
我提出的唯一解决方案似乎并不优雅:
SELECT * FROM ( SELECT * FROM t1 WHERE field_1 > 0 ORDER BY time DESC ) AS a GROUP BY mid
有更好的方法吗?
答案 0 :(得分: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
答案 1 :(得分: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