2015-09-24 4 views
1

Я пытаюсь получить случайный город из таблицы location, но не работает, Я искал Stack и пробовал много способов, пока он не работал.PHP MySQL выбирает случайное значение из таблицы

<?php include "../database.php"?> 
<?php 

$sSQLQuery = mysql_query("SELECT city FROM location ORDER BY RAND() LIMIT 1;"); 

$aResult = mysql_query($sSQLQuery); 

?> 

<span class="h3"><?php echo $aResult ?></span> 
+2

'mysql_query()' запускает запрос, вы должны иметь 'mysql_fetch_row()', чтобы соответствовать соответствующему городу, не так ли! – MaK

+2

Пожалуйста, избегайте использования 'mysql_query()' оно устарело в последних версиях. Используйте 'mysqli_ *' или PDO. –

ответ

0

Попробуйте это:

<?php 
$result = $mysqli->query("SELECT COUNT(*) FROM mytable") 
while ($row=$result->fetch_row()) { $count = $row[0]; } 
$offset = rand(0,$count); 
$result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset"); 
... 
0

использовать что-то вроде этого:

while($row = mysql_fetch_array($aResult)) 
       { 
        echo '<tr class="select">'; 
        echo '<td>'.$row['city'].'</td>'; 
        echo '</tr>'; 
       } 
0

Используя метод, который вы дали это ресурсоемким, не очень случайных и медленно и неэффективно. MySQLRAND() и особенно ORDER BY RAND() особенно неэффективен.

Чтобы ORDER BY случайного значения по всей таблицы должны быть вызваны, а затем перемешиваются, как перетасовка всех карт в колоде, чтобы выбрать первую карту из верхней части, что оставляет 51 карт, которые называются , загружен и перетасован без вывода.

Существуют различные дискуссии по теме, калечить основной SQL-код, чтобы получить немного лучший результат, такие как: https://stackoverflow.com/a/17757787/3536236

Подробнее можно прочитать здесь: http://theoryapp.com/select-random-records-in-mysql/

Итак, что можно сделать?

Ну, если у вас есть столбец идентификатора (конечно, указана) для таблицы location, что вам действительно нужно, то это значительно облегчит жизнь.

Если у вас есть НЕТ НЕДОСТАТКИ в столбце Id, то вы не можете просто найти максимальное значение и выбрать случайное число от 1 до максимума,

Так

$maxSql = mysqli_query($connection, "SELECT id FROM location ORDER BY id DESC LIMIT 1"); 
$max = mysqli_fetch_array($maxSql); 
$max = $max['id']; 

Это заказывает столик по индексированному столбцу числового идентификатора и занимает верхнее значение, которое будет самым высоким, а затем подключить его к рандомизатору PHP, чтобы дать вам:

$id = mt_rand(1,$max); 

Тогда

$sSQLQuery = mysqli_query($connection, "SELECT city FROM location 

WHERE ID = '$ ID' LIMIT 1; "); $ city = mysqli_fetch_array ($ sSQLQuery);

Если вы сделать есть пробелы, то было бы проще запустить первую часть в цикле, чтобы проверить, что значение существует, и если она существует, то вернуть эту строку, например:

unset($found); 
while(!$found){ 
$sSQLQuery = mysqli_query($connection, "SELECT city FROM location WHERE id = '$id' LIMIT 1;"); 
if (mysqli_num_rows($sSQLQuery)){ 
    $found = true; 
    $city = mysqli_fetch_array($sSQLQuery); 
    } 
$id = mt_rand(1,$max); 
} 
unset($found); 

(Существует намного больше, что можно сделать, а код здесь не идеальный - далеко от него), но концепция, которую я хочу получить, заключается в том, что с любой таблицей базы данных значимого размера, тогда она лучше и намного эффективнее для «случайный» фактор, который будет использоваться PHP, а не из MySQL внутри. PHP предлагает более случайную область и более легкое случайное генерирование, которое MySQL и таблицы выше 1000 rows, RAND() действительно, этого следует избегать, я обнаружил, что он добавляет ~ 0,25-0,4 секунды к загрузке страниц, заказывая набор из 100 результатов «случайным» способом из таблицы ~ 500.)

Также изучите и используйте MySQLi (или PDO), если это важно, в MySQL_ нет будущего (и небольшого присутствия). Updating from MYSQL to MYSQLI