【问题标题】:Sum of Counted records that calculated using "group by" with condition and "group by"使用带条件的“分组依据”和“分组依据”计算的计数记录总和
【发布时间】: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


【解决方案1】:

两个假期后我回来工作,发现“FIND_IN_SET”函数在包含空格的字符串中无法正常工作。

问题是我也被忽略了空格,(和这个问题一样)

这个查询终于奏效了:

select sum(`count`) `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`, replace(`fk_ids`,' ',''))>0
WHERE  `second_table`.`s_fk_id`=1
GROUP BY `id`
ORDER by `count` DESC

神奇的是replace(fk_ids,' ','')

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2019-04-24
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多