我有类似的东西 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?
答案 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
在给定的数据集上运行此查询,您将获得如下输出:
| 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 |
+---+-------+
这样,你可以简单地依靠这张表