我有一张这样的表:
// permlog
+----+----------+-------------+
| id | id_user | unix_time |
+----+----------+-------------+
| 1 | 2353 | 1339412843 |
| 2 | 2353 | 1339412864 |
| 3 | 5462 | 1339412894 |
| 4 | 3422 | 1339412899 |
| 5 | 3422 | 1339412906 |
| 6 | 2353 | 1339412906 |
| 7 | 7785 | 1339412951 |
| 8 | 2353 | 1339413640 |
| 9 | 5462 | 1339413621 |
| 10 | 5462 | 1339414490 |
| 11 | 2353 | 1339414923 |
| 12 | 2353 | 1339419901 |
| 13 | 8007 | 1339424860 |
| 14 | 7785 | 1339424822 |
| 15 | 2353 | 1339424902 |
| 16 | 2353 | 1466272801 |
| 17 | 2353 | 1466272805 |
+----+----------+-------------+
我需要为特定用户选择最后一行。我有两个问题:
所以这是预期的结果:
/* :id = 5462 */
| 10 | 5462 | 1339414490 |
使用order by
:
SELECT * FROM permlog WHERE id_user = :id ORDER BY unix_time DESC LIMIT 0, 1;
在where
子句中使用两个条件:
SELECT *
FROM permlog
WHERE id_user = :id AND unix_time = ( SELECT MAX(unix_time) FROM permlog WHERE id_user = :id);
哪一个更好?或者有更好的第三种选择吗?
答案 0 :(得分:1)
第一个查询是:
SELECT *
FROM permlog
WHERE id_user = :id
ORDER BY unix_time DESC
LIMIT 0, 1;
我相信这将利用permlog(id_user, unix_time desc)
上的索引(`desc被忽略,但索引应该是有用的)。这比需要两次查找值的其他方法要好。
答案 1 :(得分:-1)
这会让你最后一次"行。但是......你应该澄清你对" last"的定义。排是。它是unix时间最高的吗? unix时间最短?最后一行是否被视为ID值最高的ID? 现在,你得到的任何答案都只是对你需要的假设。
Select *
from permlog
where id = (select max(id)
from permlog
where id_user = :id)