Очень простое решение (хотя и не очень эффективное):
<?php
define('MAX_QUESTIONS',10);
$dbh = new PDO("mysql:dbname=so;host=127.0.0.1","","");
$sql = "SELECT * FROM q group by difficulty order by rand()";
$data = $dbh->query($sql);
$rows = $data->fetchAll();
$ids = getIds($rows);
while (count($rows) < MAX_QUESTIONS ) {
$sql = "SELECT * FROM q where id not in ".
"(".join(",",$ids).") group by difficulty order by rand()";
$data = $dbh->query($sql);
$more_rows = $data->fetchAll();
$rows = array_merge($rows,$more_rows);
$ids = getIds($rows);
}
print_r($rows);
function getIds($data) {
$ids = array();
foreach ($data as $v) {
$ids[] = $v['id'];
}
return $ids;
}
?>
Это необходимо, потому что группа MySQL всегда возвращает одинаковые идентификаторы, независимо от того, заказывали ли вы ранее (даже в подзапросе.)
Хорошая вещь об этом состоит в том, что он не гарантирует никаких «сгустков» (при потенциальной стоимости возврата пустого для последнего вопроса, который может создать «сгусток», вы могли бы в особом случаехотя)
Плохо то, что вам нужно больше, чем один запрос, и что упорядочение с помощью rand () ужасно неэффективно, но если ваша таблица маленькая, это, вероятно, не будет иметь значения.