Я хочу отфильтровать данные из таблицы, используя несколько условий, поэтому я использую следующий запрос.
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;
Есть ли простая альтернатива?
Каждое условие оценивается как истина / ложь, что эквивалентно 1/0 в MySQL. Вы используете сумму условий для сортировки по количеству соответствующих условий.
ORDER BY (LOWER(`content`) LIKE LOWER('%{$keywords}%')) +
(LOWER(`fname`) = LOWER('{$keywords}')) +
(LOWER(`title`) = LOWER('{$keywords}')) DESC
Я думаю, что вы можете суммировать свои условия как другой столбец и порядок по этому столбцу
потому что, как и = вернет 0 и 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
;