我有一个餐桌上的食物,上面有'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
提前致谢!
答案 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中的结果。
<强>解释强>
在这里,我们将字段onSunday
,onMonday
和onTuesday
连接在一起,找到连续字段中饼干,巧克力和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