根据条件数进行排序

时间:2017-02-20 07:44:41

标签: php mysql wordpress sorting

我想使用多个条件从表中过滤掉数据,因此我使用以下查询。

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;

有没有简单的替代方案?

3 个答案:

答案 0 :(得分:1)

我认为您可以将您的条件作为另一列并按该列排序 因为like和=将返回0和1

答案 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
;

答案 2 :(得分:1)

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

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