У меня есть следующий запрос, который я использую для возврата самых высоких баллов в игре, но я бы хотел, чтобы он был заполнен пустыми строками, если есть менее 10 записей:
SELECT id, MAX(score) mscore FROM scores WHERE id IN (".implode(',', $data).") GROUP BY id ORDER BY mscore DESC"
Логика заключается в том, что в запрос будет передан массив идентификаторов пользователей, а затем будут отсортированы самые высокие идентификаторы подсчета очков, и будет сформирована десятка лучших, у многих идентификаторов пока нет оценки, и поэтому одни только первые десять запросов возвращаются 3 или 4 ряда. Как я могу заполнить результаты запроса, пока у меня не будет 10? ID ссылается на фотографии и так далее.
Как @Thariaman сказал (+1), не делайте этого в MySql, так как это намного больше хлопот и труднее поддерживать в будущем.
Я бы попробовал что-то вроде этого (заполняя массив пустыми ключами, чтобы вы не запускали скрипт, если вы пытаетесь получить к ним доступ (или что-то еще))
function getMaxScores($gameid) { $result = query("SELECT id, MAX(score) mscore FROM scores ". "WHERE id IN (".implode(',', $data).")". "GROUP BY id ORDER BY mscore DESC LIMIT 10" ); if(count($result) < 10) { $result = array_pad($result, 10, array("id" => "", "mscore" => ""); } return $result; }
Не делайте этого в mysql. Когда вы используете php для получения набора результатов, вы просто добавляете пустые результаты по мере необходимости. (означает пустое поле массива)
while($row = mysql_fetch_array($result)) { $data[] = $row; }
Затем просто добавляйте пустые строки до тех пор, пока в наборе не будет точно 10 результатов.
while(count($data) <= 10) { $data[] = array(); }
другой альтернативой является использование цикла for и оператора if, когда вы выводите вместо foreach!
for($i=0; $i<=10; $i++) { if(isset($data[$i])) { //Show data from $data[$i] }else { show block row. } }
Хотя я согласен с тем, что вы должны справиться с этим в своем скрипте, а не внутри самого запроса, одна вещь, которая пришла на ум, была:
SELECT * FROM ( ( SELECT id, MAX(score) mscore FROM scores WHERE id IN (1,4) GROUP BY id ORDER BY mscore DESC ) UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') ) as t LIMIT 10
Но если бы я видел такой код в обзоре, разработчик получал бы «o rly?». заметка 😉
Я бы создал таблицу по умолчанию (s) с десятью строками базовых данных по умолчанию. Затем выберите нужные записи с объединением десяти строк по умолчанию и ограничьте вывод на 10, если вы находитесь в жестком кодировании или по счету по таблице по умолчанию, если вы этого не сделали.
В MySQL вы можете выбрать 10 лучших строк, используя limit
.
SELECT id, MAX(score) mscore FROM scores WHERE id IN (".implode(',', $data).") GROUP BY id ORDER BY mscore DESC LIMIT 10