Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么我的SQL语句有时不返回结果?_Mysql_Sql - Fatal编程技术网

Mysql 为什么我的SQL语句有时不返回结果?

Mysql 为什么我的SQL语句有时不返回结果?,mysql,sql,Mysql,Sql,鉴于下表: 我们有以下返回随机行的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 r

鉴于下表:

我们有以下返回随机行的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

您的查询是在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

我所看到的是,您在下面添加到第二个SQL中

AND r1.rarity = ? 
以图像中显示的数据为例,假设ID为1~29,如果r1.rarity=2,r2.ID滚为28,则将一无所获(因为ID为28-29,无rarity=2)

这应该可以通过更改下面的语句来修复

SELECT (RAND() * (SELECT MAX(id) FROM items_permanent)) AS id
进入


我所看到的是,您在下面添加到第二个SQL中

AND r1.rarity = ? 
以图像中显示的数据为例,假设ID为1~29,如果r1.rarity=2,r2.ID滚为28,则将一无所获(因为ID为28-29,无rarity=2)

这应该可以通过更改下面的语句来修复

SELECT (RAND() * (SELECT MAX(id) FROM items_permanent)) AS id
进入


与问题无关,但子查询可以是
SELECT RAND()*MAX(id)FROM items\u permanent
,您不需要两级子查询。我不明白。你正在与一个甚至不必存在的随机id进行比较,那么你期待什么呢?如果您获得一个随机id,并且在该id之后没有与其他条件匹配的记录,您将不会得到结果。与问题无关,但子查询可以是
SELECT RAND()*MAX(id)FROM items\u permanent
,您不需要两级子查询。我不明白。你正在与一个甚至不必存在的随机id进行比较,那么你期待什么呢?如果您得到一个随机id,并且在该id之后没有与其他条件匹配的记录,那么您将不会得到结果。Hmmm。谢谢,但将内部查询替换为返回与所需稀有性不匹配的行。Hmmm。谢谢,但是将内部查询替换为返回与所需稀有性不匹配的行。