2015-06-16 3 views
-1

Я использую ниже код, чтобы найти что-тоПолучить случайные строки, если полный результат текста меньше N строк

SELECT * FROM table 
    WHERE MATCH(title) AGAINST('php tutorial') LIMIT 25 

Если есть названия, которые соответствуют моему запросу, он возвращает 25 строк. Если строка пуста или менее 25 строк, я хочу получить случайные 25 строк из таблицы. Возможно ли в одном одном запросе?

ответ

0

Вместо этого используйте order by и limit:

SELECT * 
FROM table 
ORDER BY MATCH(title) AGAINST('php tutorial') DESC 
LIMIT 25 

Обратите внимание, что это может быть гораздо дороже, в зависимости от размера данных, поскольку вся таблица должна быть отсортирована.

Более эффективный метод был бы:

select t.* 
from ((select t.*, MATCH(title) AGAINST('php tutorial') as score 
     from table t 
     where MATCH(title) AGAINST('php tutorial') 
     limit 25 
    ) union all 
     (select g.*, -1 as score 
     from table g 
     where NOT (MATCH(title) AGAINST('php tutorial')) 
     limit 25 
    ) 
    ) t 
order by score desc 
limit 25; 

Это ограничивает общую сортировку, чтобы не более 50 записей. Как и исходный запрос, он не гарантирует, что наивысшие результаты будут возвращены.

+0

Вы можете объяснить, что такое t? Я получаю ошибку Неизвестная таблица 't'? – Vishnu

+0

Это псевдоним таблицы. Во втором подзапросе должно быть написано «g»;) –

Смежные вопросы