Решения как Jeremies:
SELECT * FROM table ORDER BY RAND() LIMIT 1
работа, но им нужно последовательное сканирование всей таблицы (потому что случайное значение, связанное с каждой строкой, должно быть вычислено - так, чтобы самый маленький мог быть определен), который может быть довольно медленным для даже таблиц среднего размера. Моя рекомендация состояла бы в том, чтобы использовать некоторый индексируемый числовой столбец (много таблиц имеют их как свои первичные ключи), и затем запишите что-то как:
SELECT * FROM table WHERE num_value >= RAND() *
( SELECT MAX (num_value ) FROM table )
ORDER BY num_value LIMIT 1
Это работает в логарифмическое время, независимо от размера таблицы, если num_value
индексируется. Один протест: это предполагает, что num_value
одинаково распределяется в диапазоне 0..MAX(num_value)
. Если Ваш набор данных сильно отклонится от этого предположения, Вы получите скошенные результаты (некоторые строки будут появляться чаще, чем другие).
strpos()
- один для проверки, содержит ли строка другую строку.
Существуют другие функции для проверки сходства строк и т. Д.
A switch
не будет, тем не менее, так как он сравнивает статические выражения с одним значением. Вам придется использовать if
с.