【发布时间】:2011-11-28 03:02:42
【问题描述】:
我该怎么做这样的事情?
SQL SELECT row FROM table WHERE id=max(id)【问题讨论】:
我该怎么做这样的事情?
SQL SELECT row FROM table WHERE id=max(id)【问题讨论】:
您可以使用子选择:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
请注意,如果max(id) 的值不唯一,则返回多行。
如果您只想要这样一行,请使用@MichaelMior 的回答,
SELECT row from table ORDER BY id DESC LIMIT 1
【讨论】:
id 只是表中的一列。不保证id 列中的值必须是唯一的。
id 不是主键或唯一键 :) 鉴于名称,很有可能它是。还值得注意的是,根据您使用的 DBMS,使用子选择的方法可能效率低得多。
id 可能是外键,在这种情况下它可能不是唯一的。我使用set profiling = 1; ...; show profiles 做了一些基准测试,看起来我们的解决方案使用 MySQL 具有相同的性能。据我所知,您知道哪些 DBMS 的子选择性能较差吗?
你也可以
SELECT row FROM table ORDER BY id DESC LIMIT 1;
这将按 ID 降序对行进行排序并返回第一行。这与返回具有最大 ID 的行相同。这当然假设 id 在所有行中是唯一的。否则,id 的最大值可能会有多行,而您只会得到一个。
【讨论】:
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
【讨论】:
SELECT entry FROM table WHERE id = MAX(id) 不行吗?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email) 我只需要数据库中最新条目的entry_time。该声明是否足够或应该是:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
您不能提供order by,因为order by 会对表进行“全面扫描”。
下面的查询更好:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
【讨论】:
id 是表的主键,ORDER BY 将不会进行完整扫描。 (如果不是,那么它的名字就很糟糕。)如果不是,你如何期望MAX(id) 在没有全表扫描的情况下工作?如果没有索引,则仍然必须检查每个值以找到最大值。
您也可以随时使用分析功能,这将为您提供更多控制权
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
如果您根据数据类型遇到 rank() 函数的问题,那么也可以从 row_number() 或 dense_rank() 中进行选择。
【讨论】:
试试这个
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table
【讨论】: