多个变量赋值,结果为单列

时间:2016-11-26 10:27:38

标签: mysql

我有一张这样的表

+----+------+
| ID | Name |
+----+------+
|  0 | Foo  |
|  1 | Bar  |
+----+------+

根据表格行,我想根据每一行计算排名,以便像

这样的查询
SELECT *, [calculation] AS ranking 
FROM table 
ORDER BY ranking DESC 

会返回类似

的内容
+----+------+---------+
| ID | Name | Ranking |
+----+------+---------+
|  0 | Bar  |       3 |
|  1 | Foo  |       1 |
+----+------+---------+

我的问题是,我需要每行执行多个分配而不需要获取更多列;基本上像

@ranking:= 0
IF(Name LIKE $firstTerm, @ranking := @ranking + 1, @ranking := @ranking)
IF(Name LIKE $secondTerm, @ranking := @ranking + 1, @ranking := @ranking)
IF(Name LIKE $thirdTerm, @ranking := @ranking + 1, @ranking := @ranking)

对于每一行,最后我有0,1,2或3作为我表中每个条目的一个额外列

编辑:理论上是一个动态生成的查询,如

SELECT *
FROM table
ORDER BY SUM(
  CASE
    WHEN
      (NAME LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND NAME NOT LIKE $thirdTerm)
      OR (NAME NOT LIKE $firstTerm AND NAME LIKE $secondTerm AND NAME NOT LIKE $thirdTerm)
      OR (NAME NOT LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 1
  WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name NOT LIKE $thirdTerm)
    OR (Name NOT LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 2
  WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 3
  ELSE 0
) DESC;

会按预期工作,但如果我们有超过3个术语,你可以想象这会发生什么变化!

1 个答案:

答案 0 :(得分:2)

SELECT *, 
    IF(Name like $firstTerm, 1, 0) + 
    IF(Name like $secondTerm, 1, 0) as Ranking 
  FROM table ORDER BY Ranking DESC;

但是,如果数据集变大,计算复杂,使用搜索引擎(elasticsearch,solr)将更有效,更灵活。