假设我有一个 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 ║
╚══════╩═════╩═════════╩═════════╝
time 是 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
有没有更好的办法?
这里的想法是创建一个子查询来获取最大值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 演示 http://sqlfiddle.com/#!2/6af44/9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)