【发布时间】:2018-02-27 15:27:10
【问题描述】:
对不起,这个问题的标题模糊。
我的数据库中有 2 个表,并希望在 second_table 列中存在的外键 id 上使用“group by”来计算 first_table 的记录(它存储像数组“1,2,3,4,5 这样的 id ")。
标识 |姓名 | fk_id
1 | john | 1
2 | mike | 1
3 | jane | 2
4 | tailor | 1
5 | jane | 3
6 | tailor | 5
7 | jane | 4
8 | tailor | 5
9 | jane | 5
10 | tailor | 5
标识 |姓名 | fk_ids | s_fk_id
1 | xxx | 1,5,6 | 1
2 | yyy | 2,3 | 1
3 | zzz | 9 | 1
4 | www | 7,8 | 1
现在我编写了以下查询,但它无法正常工作并显示错误的数字。
我想:
按“fk_id”计算 first_table 组中的 1 个记录
2-对“fk_ids”中存在的计数记录求和
3-显示按id分组的总和结果(相关计数的总和)。
符号“”表示“。”
select sum(if(FIND_IN_SET('fk_id', 'fk_ids')>0,'count',0) 'sum', 'count', 'from'.'fk_id', 'second_table'.* FROM 'second_table'
LEFT JOIN
(
SELECT 'fk_id', count(*) 'count'
FROM 'first_table'
group BY 'fk_id'
) AS 'from'
ON FIND_IN_SET('fk_id', 'fk_ids')>0
WHERE 'second_table'.'s_fk_id'=1
GROUP BY 'id'
ORDER by 'count' DESC
这张表有很多数据,我们没有计划改变结构。
编辑:
期望的输出:
标识 |姓名 |总和
1 | xxx | 7 (3+4+0)
2 | yyy | 2 (1+1)
3 | zzz | 0 (0)
4 | www | 0 (0+0)
【问题讨论】:
-
from是一个糟糕的表别名...避免使用 SQL 关键字! -
单引号用于字符串文字。 MySQL 使用反引号作为分隔标识符。 (ANSI SQL 使用双引号。)
-
为什么数组中的外键以开头?数据没有标准化,这个问题只会变得更糟。你能修复设计吗?
-
@jarlh 我知道,例如我写了这样的查询。
-
@JacobH 不,这是一项巨大的工作,旨在通过配置满足需求(我这样说是为了解释复杂性)。而且这种异常结构还有很多。
标签: mysql sql count sum left-join