从2个不同的表中添加总和

时间:2016-09-27 06:31:05

标签: mysql

我有类似的东西 2桌: 视频 成员

在members表中,我有每个成员的名字:

1 Tom
2 Bob
3 Zack
4 Dan
5 Casey

在视频表中,我有一个名为members的列,我的名字在那里用逗号分隔

1. Tom,Dan
2. Casey,Zack,Bob
3. Tom,Casey,Dan,Zack
4. Zack,Bob,Dan

我试图显示每个成员出现这些结果的次数:

1 Tom = 2
2 Bob = 2
3 Zack = 3
4 Dan = 2
5 Casey = 2

我是否需要执行SELECT SUM(成员)WHERE之类的操作并使用LIKE?

2 个答案:

答案 0 :(得分:3)

我强烈建议您按其他人的建议normalize提供数据。

根据您当前的设计,您可以使用FIND_IN_SET来完成所需的结果。

SELECT 
 M.id,
 M.name,
 COUNT(*) total
FROM members M 
INNER JOIN videos V ON FIND_IN_SET(M.name,V.members) > 0
GROUP BY M.name
ORDER BY M.id

See Demo

在给定的数据集上运行此查询,您将获得如下输出:

| id |  name | total |
|----|-------|-------|
|  1 |   Tom |     2 |
|  2 |   Bob |     2 |
|  3 |  Zack |     3 |
|  4 |   Dan |     3 |
|  5 | Casey |     2 |

必须阅读

Is storing a delimited list in a database column really that bad?

更多

如果您规范化数据,这就是vidoes表格的样子:

videos

id   member_id

答案 1 :(得分:0)

一种方法是根据like表达式加入两个表:

SELECT members.name, count (*) as counter from members inner join videos
ON videos.members like CONCAT('%,',members.name,',%')
GROUP BY members.name;

但我认为更好的解决方案将是@ e4c5在评论中说 - 你需要规范化数据。视频表应如下所示:

+---+-------+  
|ID | MEMBER|  
+---+-------+  
| 1 | Tom   |
| 1 | Dan   |
| 2 | Casey |
| 2 | Zack  |
| 2 | Bob   |
| 3 | Tom   |
| 3 | Casey |
| 3 | Dan   |
| 3 | Zack  |
| 4 | Zack  |
| 4 | Bob   |
| 4 | Dan   |
+---+-------+

这样,你可以简单地依靠这张表