mysql - 我用主键查询的mysql语句有时会返回多行,请问这是怎么回事?

标签 mysql

我的架构是这样的:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(10) NOT NULL,
  `account_type` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

INSERT INTO user VALUES (1, "zhangsan", "premiumv"), (2, "lisi", "premiumv"), (3, "wangwu", "p"), (4, "maliu", "p"), (5, "hengqi", "p"), (6, "shuba", "p");

我在表中有以下 6 行:

+----+-----------+--------------+
| id | user_name | account_type |
+----+-----------+--------------+
|  1 | zhangsan  | premiumv     |
|  2 | lisi      | premiumv     |
|  3 | wangwu    | p            |
|  4 | maliu     | p            |
|  5 | hengqi    | p            |
|  6 | shuba     | p            |
+----+-----------+--------------+

这里是mysql通过id查询表:

SELECT * FROM user WHERE id = floor(rand()*6) + 1;

我希望它返回一行,但实际结果是不可预测的。它会返回 0 行、1 行或有时不止一行。有人可以帮忙澄清一下吗?谢谢!

最佳答案

您要针对不同的随机数测试每一行,因此有时会有多行匹配。要解决此问题,请在子查询中计算一次随机数。

SELECT u.*
FROM user AS u
JOIN (SELECT floor(rand()*6) + 1 AS r) AS r 
ON u.id = r.r

这种从表格中随机选择行的方法似乎是一个糟糕的设计。如果 id 序列中有任何间隙(这很容易发生——MySQL 不保证它们总是顺序的,并且删除行会留下间隙)那么它可能会返回一个空结果.从表中选择随机行的常用方法是:

SELECT *
FROM user
ORDER BY RAND()
LIMIT 1

关于mysql - 我用主键查询的mysql语句有时会返回多行,请问这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626570/

相关文章:

java - 当我从 android 访问 Java servlet 时,mysql 数据库没有更新

sql - MySQL 查询 : Join and Group

mysql - 带有 IN 语句的存储过程 (mysql)

前n行的Mysql GROUP_CONCAT

java - Mysql - JPA 没有插入第三个表多对多

mysql - 仅选择存在的列

PHP password_hash 和 password_verify 不适用于 MySQL

PHP/MYSQL : Storing a list or massive table

mysql - sql - 如何进行此查询?

php - 从 mysql varchar 返回 null 的 json 值