2017-02-20 88 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

每个条件的计算结果为true/false,这相当于MySQL中的1/0。您可以使用条件总和按照匹配条件的数量进行排序。

+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

感谢它的工作 –

相关问题