Почему мой оператор SQL иногда не дает результатов? - PullRequest
0 голосов
/ 03 декабря 2018

Учитывая следующую таблицу:

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

Иногда оно вообще не возвращает строк, с пугающей регулярностьюскажем, один из десяти казней).

Что вызывает это?И как я мог предотвратить или исправить это?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

То, что я вижу, это то, что вы добавили ниже к 2-му SQL

AND r1.rarity = ? 

. Возьмите данные, показанные на рисунке, в качестве примера, предположим, что у вас есть ID 1 ~ 29, вы ничего не получите, если у вас есть r1.rarity = 2 с r2.id свернутым как 28 (потому что нет редкости = 2 с ID 28-29)

Это можно исправить, изменив приведенный ниже оператор

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

на

SELECT (RAND() * (SELECT MAX(id) FROM items_permanent WHERE rarity = ?)) AS id
0 голосов
/ 03 декабря 2018

Ваш запрос выбирает случайное число в диапазоне идентификаторов, а затем ищет следующую строку в таблице, которая соответствует условиям.Если ни одна из строк после случайного идентификатора не соответствует условиям, вы ничего не получите.Вы должны также включить условия при выборе случайного идентификатора.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...