2017-02-20 7 views
0

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

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

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

+0

Это выглядит просто :) –

1

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

+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 
; 
+0

Спасибо, что он работает –

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