2015-09-15 33 views
0

我试过了一些选项,但它根本不起作用或不符合我的需要。带CAST或SUM问题的SQL CASE

其对下面的SQL(这并不工作,但最为接近我所需要的):

SELECT CASE WHEN r.`content` LIKE '% word1 %' 
      then 1 
      else 0 
     END AS `val1` 
    , CASE WHEN r.`content` LIKE '% word2 %' 
      then 1 
      else 0 
     END AS `val2` 
    , CASE WHEN r.`city` LIKE 'cityname' 
      then 1 
      else 0 
     END AS `val3` 
    , (`val1`+`val2`+`val3`) AS `reference_value` 
FROM `testimonials` as r 
WHERE `accepted`='1' 
ORDER BY `reference_value` 

所以基本上与最高分进入端在顶部。当3例匹配reference_value将有3分。 该代码是动态的,所以它也可以是4,5,6,7或更多CASE。

我希望这对你有任何意义。 在此先感谢。

+1

总是提供一些数据集和预期结果。不管你用“文字”来解释它有多清楚。有这个:...想要这个:...将以最快的方式正确回答 – M0rtiis

回答

3

您不能重复在同一SELECT列表计算值(如在查询val1)。

使用子查询,或者重复CASE来求和它们的值。在这种情况下,我的首选是子查询,但实际需求和实际执行计划(解释)可以在任何时候覆盖它。

SELECT 
    val1,val2,val3, 
    val1+val2+val3 as reference_value 
FROM (
    SELECT CASE WHEN r.`content` LIKE '% word1 %' 
      then 1 
      else 0 
     END AS `val1` 
    , CASE WHEN r.`content` LIKE '% word2 %' 
      then 1 
      else 0 
     END AS `val2` 
    , CASE WHEN r.`city` LIKE 'cityname' 
      then 1 
      else 0 
     END AS `val3` 
    FROM `testimonials` as r 
    WHERE `accepted`='1' 
) TMP 
ORDER BY `reference_value` 
+0

感谢您的快速回复!我仍然得到错误:#1054 - '字段列表'中的未知列'val1' – Rob

+0

是的,我忘记删除原来的总和线。固定 – Pred

0
SELECT *,val1+val2+val3 AS `reference_value` FROM (
    CASE WHEN r.content LIKE '% word1 %' 
     then 1 
     else 0 
    END AS `val1` 
    ,CASE WHEN r.content LIKE '% word2 %' 
     then 1 
     else 0 
    END AS `val2` 
    ,CASE WHEN r.city LIKE 'cityname' 
     then 1 
     else 0 
    END AS `val3` 
    , 
    FROM `testimonials` as r 
    WHERE `accepted`='1' 
) 
ORDER BY `reference_value`