mysql中的字符串操作[计算不同列中的字​​符串]

时间:2014-05-28 08:59:49

标签: mysql sql

我有一个餐桌上的食物,上面有'onSunday''onMonday'和'on Tuesday“:

person      onSunday              onMonday       onTuesday
1          Biscuits: Chocolates   Biscuits       Chocolates
2          Chocolates             Biscuits       Pi: chocolates

从这套{饼干,巧克力,Pi},

有没有办法在mysql中获得1人饼干,巧克力和Pi的总数?

第1人的预期结果:

 Biscuits=2
 Chocolates = 2
 Pi = 0

提前致谢!

2 个答案:

答案 0 :(得分:2)

你的关系设计很尴尬。它甚至不符合第一范式,因为你的列值不是原子的(我在那里看到一个冒号分隔的列表,对吧?)。我可以用一个冗长的复杂查询来回答,但最好先改变你的设计。

这可能是更好的设计:

CREATE TABLE meals(
    person INT,
    meal TEXT,
    day TEXT
)

然后你会在这张桌子上每餐吃一排,例如,

person meal day                          
1 Biscuits onSunday
1 Chocolates onSunday
1 Biscuits OnMonday
1 Chocolates onTuesday  
...

然后你的查询就像这样简单:

SELECT meal, COUNT(*) FROM meals WHERE person = 1 GROUP BY meal

好处是您可以添加新餐而无需更改查询。在另一个答案中,必须针对您介绍的每一餐进行调整。您还可以添加剩余的工作日,而无需添加新列。

答案 1 :(得分:1)

试试这个:

SELECT person,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Biscuits', '')))/8 AS Biscouits,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Chocolates', '')))/10 AS Chocolates,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Pi', '')))/2 AS Pi
FROM food

结果:

PERSON  BISCOUITS   CHOCOLATES  PI
1       2           2           0
2       1           1           1

请参阅SQL Fiddle中的结果。

<强>解释

在这里,我们将字段onSundayonMondayonTuesday连接在一起,找到连续字段中饼干,巧克力和pi的出现。

<强>优势:

即使onSunday中有多个饼干,此查询也会为您提供正确的答案。

NB:要搜索某个人,请在查询结尾处使用WHERE子句。像:

SELECT person,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Biscuits', '')))/8 AS Biscouits,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Chocolates', '')))/10 AS Chocolates,
     (LENGTH(CONCAT(onSunday,onMonday,onTuesday)) - LENGTH(REPLACE(CONCAT(onSunday,onMonday,onTuesday), 'Pi', '')))/2 AS Pi
FROM food
WHERE person=1