Вы можете использовать метод объединения, который присваивает вычисленное значение 1, 2 или 3 каждой из трех таблиц, а затем случайным образом выбирает записи только из одной таблицы:
SELECT *
FROM
(
SELECT *, 1 AS label FROM low UNION ALL
SELECT *, 2 FROM med UNION ALL
SELECT *, 3 FROM high
) t
WHERE label = FLOOR(RAND()*3+1); -- random number between 1 and 3 inclusive
select * from high
union all
select * from med
union all
select * from low
order by rand()
limit 1
Вы использовали тег PHP, поэтому на этом языке это может быть так:
$tables = ['low', 'med', 'high'];
$randomTable = $tables[mt_rand(0, 2)];
$query = 'SELECT * FROM '.$randomTable;
$mysqli = new mysqli("host","my_user","my_password","my_db");
$result = $mysqli -> query( $query);
В MySQL, помимо других решений, это может быть так:
Выберите стол случайным образом:
set @randomNumber = FLOOR(RAND()*3+1);
set @table = IF(@randomNumber = 1, 'low', IF(@randomNumber = 2, 'med', 'high'));
или
set @table = CASE
WHEN @randomNumber = 1 THEN 'low'
WHEN @randomNumber = 2 THEN 'med'
ELSE 'high'
END;
Создайте и запустите запрос:
SET @s = CONCAT('select * from ', @table);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Как выбрать из MySQL, где имя таблицы является переменной
MySQL получает случайное значение между двумя значениями
Я выбрал этот ответ, потому что скрипт работает быстрее. Ответ Тима Бигелейзена также сработал. Но я пытаюсь добавить дополнительные запросы, используя UNION, и я должен что-то упустить. Вот код: $tables = ['низкий', 'средний', 'высокий']; $randomTable = $tables[mt_rand(0, 2)]; $query2 = '(SELECT * FROM low ORDER BY RAND() LIMIT 0,3) UNION (SELECT * FROM med ORDER BY RAND() LIMIT 0,1) UNION (SELECT * FROM '.$randomTable.' ORDER BY RAND( ) ПРЕДЕЛ 0,1) ';
Спасибо. Пожалуйста, можете ли вы объяснить, что вы ожидаете от этого запроса? И что в этом плохого? Это выдает ошибку или нежелательный результат?
Приведенный выше код работает, но я добавил несколько предложений WHERE, которые вызвали синтаксическую ошибку. Я нашел проблему. Спасибо
I have 3 identically structured tables called low, med, high.
похоже, вам лучше иметь таблицу с дополнительным столбцом для вашего низкого, среднего, высокого вместо этого