在where子句中使用VS两个条件的顺序

时间:2016-06-25 21:35:59

标签: mysql sql

我有一张这样的表:

// 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);

哪一个更好?或者有更好的第三种选择吗?

2 个答案:

答案 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)