Моя проблема в значительной степени объяснительна, но я не могу полностью ее решить, чтобы сделать ее максимально эффективной.
Я хочу выбрать случайную запись из базы данных MySQL. Я хочу, чтобы это было как можно быстрее и максимально эффективно (это всегда цель, не так ли?). Когда я выбираю эту строку, я хочу выбрать другую строку, но не такую, как раньше. Если я выберу 10 строк, я хочу, чтобы 11-я строка отличалась от всех остальных (скажем, уникальная :)). Но когда у меня заканчиваются строки, я хочу «сообщить об ошибке».
Чтобы понять суть проблемы. Я использую PHP с MySQL. У меня есть входной массив, содержащий названия, которые уже были выбраны. Затем я получаю подсчет всех элементов в базе данных, поэтому я знаю, сколько раз я могу «пропустить максимум». Давайте вставьте код, чтобы узнать, что мы имеем здесь.
try { $db = new PDO("mysql:host=localhost;dbname=xxxxx;charset=utf8", "xxxx", "xxxx"); $played = explode(":;:", $_POST['items']); //All already selected items are in $_POST separated by :;: $sql = "SELECT count(id) AS count FROM table"; //Lets get the total count of items $query = $db->prepare($sql); $query->execute(); $result = $query->fetch(PDO::FETCH_ASSOC); $count = $result['count']; //There we are... $i = 0; //Index counter so we dont exceed records.. well kinda (more on that below) do //do while because we want something to be selected first { $sql = "SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM table"; //From here $query = $db->prepare($sql); $query->execute(); $result = $query->fetch(PDO::FETCH_ASSOC); $offset = $result['offset']; $sql = "SELECT itemXML FROM table LIMIT $offset, 1"; $query = $db->prepare($sql); $query->execute(); $result = $query->fetch(PDO::FETCH_ASSOC); //To here is some code to randomly select a record "as efficiently as possible".. $output = Array(); $xml = simplexml_load_string($result['itemXML']); $i++; } while (in_array($xml->{"title"}, $played) && $i < $count); //While record title is in array and while we have not exceeded the total number of records (that's the logic but it isint that simple is it?) if ($i >= $count) { die("400"); //Just a random status code which I parse with the client. } $itemArr = Array("whatever" => $xml->{"whatever-attr"}, "title" => $xml->{"title"}); array_push($output, $itemArr); Lets push this to out array echo json_encode($output); //Aaaaand finally lets print out the results } catch (Exception $e) //If anything went wrong lets notify our client so he can respond properly { $output = Array("error" => $e->getMessage()); die(json_encode($output)); }
Да, хорошо .. Проблема в том, ЧТО ЕСЛИ 10 записей, было выбрано 9 строк, а индексный счетчик $i
становится больше или равен 10, а случайные записи – в массиве. Затем у нас есть одна строка, которая должна быть выбрана, но ее нет.
И как мне это исправить? Ваша помощь будет очень признательна!
Если бы я не объяснил это достаточно хорошо, дайте мне знать, я постараюсь усерднее.