Мой вопрос относится к другой ветке обсуждения - MySQL выбирает 10 случайных строк из 600K строк быстро .
У меня есть простая таблица из одного столбца:
+-----------------------+
| keywords |
+-----------------------+
| Some text 1 |
| Some text 2 |
| Some text 3 |
| Some text 4 |
| Some text 5 |
| Some text 6 |
| Some text 7 |
| Some text 8 |
| Some text 9 |
| Some text 10 |
| Some text 11 |
| Some text 12 |
| ... |
| Some text 1200000 |
+-----------------------+
Я пытаюсь выполнить запрос к некоторому количеству случайных строк, используя код, рекомендованный #Riedsio в строке выше, вот так:
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
Мой код следующий:
<?php
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
}
$servername = "localhost";
$username = "admin";
$password = "admin_pass";
$dbname = "db_name";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// $stmt = $conn->prepare("SELECT keywords FROM my_keywords");
$stmt = $conn->prepare("SELECT keywords FROM my_keywords AS r1 JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM my_keywords)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
В результате получается следующая ошибка: «Ошибка: SQLSTATE [42S22]: столбец не найден: 1247 Ссылочный« идентификатор »не поддерживается (прямая ссылка в списке элементов)».
Я простоначиная с MySQL, так что, пожалуйста, не обижайтесь на этот глупый вопрос и спасибо за вашу помощь.