mysql - 为什么我的 SQL 语句有时没有返回结果?

标签 mysql sql

给出下表:

enter image description here

我们有以下返回随机行的 SQL 语句:

SELECT r1.id, game_desc, rarity, unlocks_prior 
FROM items_permanent AS r1 
JOIN (
    SELECT (RAND() * (SELECT MAX(id) FROM items_permanent)) AS id
) AS r2    
WHERE r1.id >= r2.id AND r1.unlocks_prior is Null 
ORDER BY r1.id ASC 
LIMIT 1

这本来就可以正常工作,但是当我们需要按稀有度随机化时,因此需要将上面的内容更改为下面的内容:

SELECT r1.id, game_desc, rarity, unlocks_prior 
FROM items_permanent AS r1 
JOIN (
    SELECT (RAND() * (SELECT MAX(id) FROM items_permanent)) AS id
) AS r2 
WHERE r1.id >= r2.id AND r1.unlocks_prior is Null AND r1.rarity = ? 
ORDER BY r1.id ASC 
LIMIT 1

它有时根本不返回任何行,规律性惊人(我会说,十分之一的执行)。

这是什么原因造成的?我该如何预防或修复它?

最佳答案

您的查询是在 ID 范围内选择一个随机数,然后在表中查找与条件匹配的下一行。如果随机 ID 之后的行均不符合条件,则您将一无所获。您还需要在选择随机 ID 时包含条件。

SELECT r1.id, game_desc, rarity, unlocks_prior 
FROM items_permanent AS r1 
JOIN (
    SELECT RAND() * MAX(id) AS id
    FROM items_permanent
    WHERE unlocks_prior is Null AND rarity = ? 
) AS r2 ON r1.id >= r2.id
WHERE r1.unlocks_prior is Null AND r1.rarity = ? 
ORDER BY r1.id ASC 
LIMIT 1

关于mysql - 为什么我的 SQL 语句有时没有返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53591111/

相关文章:

php - 如何通过 Internet 将数据更新远程发送到托管的 MySQL 数据库?

mysql - cronjob java.sql.SQLException : Parameter index out of range (1 > number of parameters, 出现错误,为 0)

PHP PDO 未在我的网页上显示任何数据

mysql - MySQL 查询缓存问题

Java string/stringbuilder 在MySql数据库中插入null

mysql - 将数据从数据库添加到组合框

mysql - SQL 语句 值乘以 3

mysql - 来自 C 应用程序和 mysql 控制台的不同 mysql 触发器

python - LAN 上的 SQLite

sql - Azure sql 数据同步代理 2 无法安装