2016-11-26 25 views
1

我有一个表像这样与单列作为结果,对多个变量赋值

+----+------+ 
| 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 | 
+----+------+---------+ 

我的问题是,我需要每行执行多个任务W¯¯没有得到更多的专栏;基本上类似

@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个术语,这将是怎么回事!

+0

告诉我们更多关于计算 – Strawberry

+0

这应该是多个LIKE比较的,因此,它有更多的比赛,越高它的排名 – RoiEX

+0

@Strawberry我编辑我的问题是更正确的(加了LIKE语句例子) – RoiEX

回答

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

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

+0

这正是我所需要的!谢谢!应该有这个想法! – RoiEX