Сортировка по количеству условий

Я хочу отфильтровать данные из таблицы, используя несколько условий, поэтому я использую следующий запрос.

SELECT * FROM `usersposts`
WHERE (LOWER(`content`) LIKE LOWER('%{$keywords}%')
OR LOWER(`fname`) = LOWER('{$keywords}')
OR  LOWER(`title`) = LOWER('{$keywords}')) AND approval=1"

Что работает, как и ожидалось, но теперь мне нужно отсортировать результат по количеству условий, удовлетворяющих строке. Например, если одна строка удовлетворяет всем операторам или, то она должна быть в верхней части, а единственное условие должно быть в конце. Как мне этого добиться?

Что я попробовал:

WHERE (LOWER(`content`) LIKE LOWER('%{$keywords}%')
OR LOWER(`fname`) = LOWER('{$keywords}')
OR  LOWER(`title`) = LOWER('{$keywords}')) AND approval=1
ORDER BY
WHEN LOWER(`content`) LIKE LOWER('%{$keywords}%') AND LOWER(`fname`) = LOWER('{$location}') AND  LOWER(`title`) = LOWER('{$keywords}') THEN 1
WHEN (LOWER(`content`) LIKE LOWER('%{$keywords}%') AND LOWER(`fname`) = LOWER('{$keywords}'))
OR (LOWER(`post_author_fname`) = LOWER('{$keywords}') AND  LOWER(`title`) = LOWER('{$keywords}'))
OR (LOWER(`content`) LIKE LOWER('%{$keywords}%') AND  LOWER(`title`) = LOWER('{$keywords}')) THEN 2
ELSE 3 END
ASC;

Есть ли простая альтернатива?

0

Решение

Каждое условие оценивается как истина / ложь, что эквивалентно 1/0 в MySQL. Вы используете сумму условий для сортировки по количеству соответствующих условий.

ORDER BY (LOWER(`content`) LIKE LOWER('%{$keywords}%')) +
(LOWER(`fname`) = LOWER('{$keywords}')) +
(LOWER(`title`) = LOWER('{$keywords}')) DESC
1

Другие решения

Я думаю, что вы можете суммировать свои условия как другой столбец и порядок по этому столбцу
потому что, как и = вернет 0 и 1

1

Вы можете использовать что-то вроде этого:

SELECT *
FROM `usersposts`
WHERE
(LOWER(`content`) LIKE LOWER('%{$keywords}%')
OR
LOWER(`fname`) = LOWER('{$keywords}')
OR
LOWER(`title`) = LOWER('{$keywords}'))
AND
approval=1
ORDER BY (
IF( (LOWER(`content`) LIKE LOWER('%{$keywords}%') ,1,0)
+ IF( LOWER(`fname`) = LOWER('{$keywords}') ,1,0)
+ IF( LOWER(`title`) = LOWER('{$keywords}')) ,1,0)
) DESC
;
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector