2016-08-24 68 views
0

我有一个包含一组引用(序列化数组)的表并且要计算出现次数。例如我的表看起来像计算另一列中列的出现次数

ID  type  reference 
206  "apple"  "" 
211  "fruits" "a:1:{i:0;s:3:"206";}" 
212  "apple"  "" 
214  "fruits" "a:1:{i:0;s:3:"212";}" 
217  "apple"  "" 
359  "fruits" "a:1:{i:0;s:3:"206";i:1;s:3:"360";}" 
360  "apple"  "" 

现在我要怎么算往往是从苹果的ID水果被引用,这样,我的决赛桌看起来应该是这样

ID  type count 
206 "apple" 2 
212 "apple" 1 
217 "apple" 0 
360 "apple" 1 

我的第一个想法是计算字符串':“$ ID”;“的出现次数(即':“206”;'),但我不知道如何为每个ID做这个,而且我不知道这是否会保存,因为这些是序列化数组。

有没有办法用mysql做到这一点?

+2

有没有什么好理由以这种方式存储数据?或者你能改变它吗? –

+0

实际上这是一个多选字段,它以这种方式存储在数据库中。不幸的是我不能改变它... – pedral

+0

如果你改变它会发生什么? – Strawberry

回答

0

这适用于给定的数据:

select t1.ID, t1.type, count(t2.type) as `count` 
from table1 t1 
left join table1 t2 
    on t2.type = 'fruits' 
    and t2.reference like concat('%"', t1.ID, '"%') 
where t1.`type` <> 'fruits' 
group by t1.ID, t1.type; 

结果:

| ID | type | count | 
|-----|-------|-------| 
| 206 | apple |  2 | 
| 212 | apple |  1 | 
| 217 | apple |  0 | 
| 360 | apple |  1 | 

http://sqlfiddle.com/#!9/2a790/4

有很多疯狂的事情,你可以用SQL做的 - 但事实并非如此意味着你应该。