我的架构是这样的:
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/