我读到要获取第一条表记录,您可以使用LIMIT 1
. 我试图将这些知识应用到我的JOIN
陈述中,但得到了截然相反的结果。它连接了连接表的最后一条记录
SELECT * FROM users;
用户身份 | 用户名 | [更多专栏] |
---|---|---|
1个 | 米奇_m | [...] |
[...] | [...] | [...] |
6个 | 菊花 | [...] |
SELECT * FROM roles;
角色编号 | 角色 |
---|---|
1个 | 用户 |
2个 | 行政 |
INSERT IGNORE INTO user_role (user_id, username, role_id, role)
SELECT users.id, users.username, roles.id, roles.role
FROM users
JOIN roles ON roles.role = 'ADMIN' LIMIT 1;
SELECT * FROM user_role;
用户身份 | 用户名 | 角色编号 | 角色 |
---|---|---|---|
6个 | 菊花 | 2个 | 行政 |
为什么会这样?LIMIT
将结果集限制为最后一条记录而不是第一条记录似乎不自然
连这个
INSERT IGNORE INTO user_role (user_id, username, role_id, role)
SELECT first_row.id, first_row.username, roles.id, roles.role
FROM (SELECT id, username FROM users LIMIT 1) AS first_row
JOIN roles ON roles.role = 'ADMIN';
SELECT * FROM user_role;
产生相同的
在这两种情况下,我都希望得到这个
用户身份 | 用户名 | 角色编号 | 角色 |
---|---|---|---|
1个 | 米奇_m | 2个 | 行政 |
在某些情况下是否会SELECT
自下而上进行选择?好像是因为 plainSELECT
就像这个
SELECT * FROM users LIMIT 1;
确实检索第一行。但是,如果您指定列
SELECT id, username FROM users LIMIT 1;
你观察到同样的问题(取而代之的是最后一行)
Sage(一个聊天机器人)说到时LIMIT
,不能保证顺序,所以我应该使用ORDER BY
(顺便说一句,它确实有帮助)。这样对吗?是否将LIMIT 1
结果集限制为满足条件的随机行?那为什么总是最后一个呢?这种可能性无限小
您观察到的行为可能是由于使用了 LIMIT 子句。当您在没有显式 ORDER BY 子句的情况下使用 LIMIT 时,数据库将返回一组满足查询条件的任意行,但不保证行的顺序。换句话说,数据库可能会返回第一行、最后一行或任何其他满足查询条件的行。
-智者
如果没有指定子句,则永远无法
SELECT
保证查询结果的顺序。在几乎所有现代关系数据库系统中都是如此(根据 SQL 标准)。ORDER BY
您可以在此 DBA.StackExchange.com 答案中找到更多特定于 MySQL 的信息:
对于你的问题“ «那为什么它总是最后一个?» “:
您几乎可以将此归因于重复运行的运气(正确的术语是nondeterminsim - 与随机不太一样)。正如上面提到的“ MySQL 按照它想要的方式对记录进行排序”。这真正意味着数据库引擎的算法根据它在幕后经历的大量操作的结果返回行。目前,它似乎是可重复的顺序,但由于数据库引擎的复杂性以及承诺缺乏没有
ORDER BY
条款的保证,它并不总是可重复的,并且可能由于多种原因而意外地发生变化。因此,您不应该依赖今天看到的顺序与将来看到的顺序相同——没有条款
ORDER BY
。