mysql - 在 where 子句中使用 order by VS 两个条件

标签 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  |
<小时/>

使用排序方式:

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

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

最佳答案

第一个查询是:

SELECT *
FROM permlog
WHERE id_user = :id
ORDER BY unix_time DESC
LIMIT 0, 1;

我相信这将利用 permlog(id_user, unix_time desc) 上的索引(`desc 被忽略,但索引应该有用)。这比需要查找值两次的其他方法更好。

关于mysql - 在 where 子句中使用 order by VS 两个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033175/

相关文章:

mysql - 是否可以删除以下 SQL 查询的 UNION

Mysql停用词和匹配

java - Hibernate 持久实体应该有一个主键

sql - 试用 PostgreSQL/Postgres(我是一个普通的 MySQL 用户)——推荐任何引用资料,任何陷阱?

php - 将行中的数据放入无 php 站点进行编辑

Php mysql 查询在 chrome 中有效,但在 firefox/IE 中无效

java - 没有找到适合 getDate(Date) 的方法

html - SQL - 删除字符串中的所有 HTML 标记

mysql - 使用触发器相互依赖的多个 sql 查询

mysql - 如何编写测试一对多表中两列的 select 语句