2015-11-03 52 views
2

我有一个用于搜索功能的Mysql SELECT查询,如果它们与db中的ID匹配,我想检查一个ID数组。MYSQL ORDER BY CASE 1st CASE应按ID排列

我的客户希望它以特定的方式排序,所以我将不得不使用ORDER BY CASE,但我似乎无法弄清楚如何将其与ID数组组合。我尝试使用FIELD函数,但是这似乎不能与ORDER BY CASE结合使用。

有人有什么建议吗?

我的ORDER BY至今:

ORDER BY 
      CASE 
       WHEN FIELD(p.ID, $implodedArray) THEN '0' 
       WHEN p.post_title LIKE '%$keyword%' THEN '1' 
       WHEN pm.meta_value LIKE '%$keyword%' THEN '2' 
       WHEN p.post_content LIKE '%$keyword%' THEN '3' ELSE '4' END, 
+0

在php中使用in_array来知道哪些id应该具有更高的优先级并从此处获取它。 – Mihai

+0

@Mihai取决于结果的大小,可能是一个巨大的时间沉没 –

回答

1

您可以使用find_in_set()

ORDER BY 
    CASE 
     WHEN FIND_IN_SET(p.ID, $implodedArray) THEN 0 
     WHEN p.post_title LIKE '%$keyword%' THEN 1 
     WHEN pm.meta_value LIKE '%$keyword%' THEN 2 
     WHEN p.post_content LIKE '%$keyword%' THEN 3 
     ELSE 4 
    END 

这是假设你被引爆你的阵列,像这样

implode(',', $some_array); 

的原因是因为FIND_IN_SET使用逗号分隔的字符串aka .. '1,2,3,4,5'

+0

我猜find_in_set是快速发展) – Mihai

+0

@Mihai它不算太糟糕,因为它的顺序与桌上的单一扫描。 –

+0

非常感谢,这解决了我的问题:) – Lennart