Я столкнулся с проблемой, когда мои идентификаторы не были последовательными. Что я придумал с этим.
SELECT * FROM products WHERE RAND()<=(5/(SELECT COUNT(*) FROM products)) LIMIT 1
Возвращенных строк примерно 5, но я ограничиваю их до 1.
Если вы хотите добавить еще одно предложение WHERE, оно станет немного интереснее. Скажем, вы хотите искать товары со скидкой.
SELECT * FROM products WHERE RAND()<=(100/(SELECT COUNT(*) FROM pt_products)) AND discount<.2 LIMIT 1
Что вам нужно сделать, это убедиться, что вы возвращаете достаточно результата, поэтому я установил его на 100. Наличие предложения WHERE discount <.2 в подзапросе было в 10 раз медленнее, поэтому лучше возвращать больше результатов и ограничивать . </p>