计算一个值在*一*行/记录中不同列中的出现次数


Count number of occurences of a value in different columns in *one* row/record

当我设置表时,我可能用了错误的方式?我使用的是mysql&php。大量的谷歌搜索只显示如何计算一个值在几行中出现的次数,我想在多个不同的列中检查一个值,但在同一记录中。(我认为:计算每行有数据的列的数量可能是一样的,也许?但我不明白。)

我有一张桌子,上面有我希望每天努力实现的目标。因此,我希望每一天都标记:"成功"或"失败"。插入效果很好。我一直在寻找一种计算成功次数的方法;"今天"的失败次数,以显示正确的微笑,根据失败次数和成功次数,微笑是鼓励还是悲伤。

例如:

ID  date          drinkMoreWater    goToBedEarlier    callADearFriend
1   2012 jan 15   fail              fail              fail
1   2012 jan 16   success           _(still empty)    success

所以,如果今天是1月15日,微笑的人会非常非常难过。如果今天是1月16日,笑脸上会有星星(至少在我进球2失败之前;)

您的表实际上应该采用不同的结构,以使您的生活更轻松:

Goals:
ID     Goal
1      drinkMoreWater
2      goToBedEarly
3      callADearFriend
Status:
ID     Status
1      Success
2      Fail
Tracking:
ID     Date      Goal_ID     Status_ID
1      1/1/2012  1           1
1      1/1/2012  3           2
1      1/2/2012  2           1
1      1/2/2012  4           1

现在,您可以轻松地添加目标和状态(例如"正在处理"),并且您的表结构不必为了适应您的更改而更改,您的查询也变得简单多了。

如果你想在SQL中做到这一点,你可以使用一个类似三元的结构,比如:

SELECT *, 
       (CASE drinkMoreWater WHEN 'success' THEN 1 ELSE 0 END)
     + (CASE goToBedEarlier WHEN 'success' THEN 1 ELSE 0 END)
     + (CASE callADearFriend WHEN 'success' THEN 1 ELSE 0 END)
     AS numberOfSuccesses 
FROM yourTable

您可以这样做:

Select case when sub.smilies = 0 then "very very sad" else 
             case when sub.smilies = 1 then "sad" else "hubby" end
        end as "Number of Smilies"
from
(
     Select case when t.drinkMoreWater  = "fail" then 0 else 1 end +
            case when t.goToBedEarlier  = "fail" then 0 else 1 end +
            case when t.callADearFriend = "fail" then 0 else 1 end as smilies 
     from yourTableName t 
     where date = @date
) sub

您将需要处理空字符串,并处理这些case语句。这个解决方案适用于您当前的设计,但您最好考虑@BassamMehanni的回答

建议的重新设计