如何为每列定义优先级,然后按该优先级显示结果顺序?

时间:2015-10-08 16:29:27

标签: mysql sql

我有一张这样的表:

// tablename
+----+---------+-----------------------+
| id | subject |        context        |
+----+---------+-----------------------+
| 1  |  ali    |    hello              |
| 2  |  peter  |    what's up jack     |
| 3  |  jack   |    have fun           |
+----+---------+-----------------------+

subject类型varcharcontexttext

现在,我需要在两列subjectcontext中进行搜索查询。所以我有一个像这样的索引:fulltext(subject,context)这里是我的查询:

SELECT * FROM tablename WHERE MATCH (subject,context) AGAINST ($var) limit 10;

现在我的问题是结果类型 :(假设为$var = 'jack'),因此有两个结果(id=2(在context列中) ,id=3(在subject列中))。现在,首先,我想显示subject列的所有结果,然后显示context列的结果。换句话说,我想要这个输出:

+----+---------+-----------------------+
| 3  |  jack   |    have fun           |
| 2  |  peter  |    what's up jack     |
+----+---------+-----------------------+

那么如何在我的sql中使用order by来实现这样的东西?

2 个答案:

答案 0 :(得分:0)

你可以

ORDER BY subject 

按主题排序。

如果您想要自定义排序,您可以执行以下操作:

ORDER BY CASE WHEN subject = 'Jack' THEN 1
              WHEN subject = 'Ali' THEN 2
              ELSE 3 END, subject 

这将始终将杰克置于顶部,然后是阿里,其余的将按主题排序。

对于您的方案,只需更改一下:

ORDER BY CASE WHEN subject = $var THEN 1
              WHEN context = $var THEN 2
              ELSE 3 END, subject 

您可能需要使用CHARINDEX来查找变量:

ORDER BY CASE WHEN CHARINDEX ($var, subject) > 0 THEN 1
              WHEN CHARINDEX ($var, context) > 0 THEN 2
              ELSE 3 END, subject 

答案 1 :(得分:0)

有趣。 我刚刚在Oracle中尝试了以下查询。我可以通过指定排序顺序通过asc或desc进行排序。我认为同样可以在mysql中实现,也可以由han

建议
SELECT * FROM employees where subject like '%jack%' or context like '%jack%'
ORDER BY CASE WHEN subject like '%jack%' THEN 1
              ELSE 2 END, subject;