Mysql 为什么我的SQL语句有时不返回结果?
鉴于下表: 我们有以下返回随机行的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
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。谢谢,但是将内部查询替换为返回与所需稀有性不匹配的行。