SQL COUNT使用GROUP_CONCAT返回错误的值

时间:2014-08-14 09:45:27

标签: mysql sql count

我目前正在编写一个查询来搜索三个表(invoice,job_lines和item_records)。 job_lines和item_records每个invoice.id都有多个条目,因此我尝试将它们组合成每个id一行。

它似乎工作到目前为止,但计数(*)每行返回item_records.MAWB / item_records.HAWB的数量,而不是分组条目的总数。

有没有办法获得实际的团体总数?

SELECT      

        COUNT(*), 
        invoice.id,   
        IFNULL(GROUP_CONCAT(DISTINCT job_lines.job_number SEPARATOR ' '),''),   
        IFNULL(GROUP_CONCAT(DISTINCT item_records.MAWB SEPARATOR ' '),''),   
        IFNULL(GROUP_CONCAT(DISTINCT item_records.HAWB SEPARATOR ' '),'')    
FROM      

        invoice   
LEFT JOIN job_lines ON invoice.id=job_lines.taken   
LEFT JOIN item_records ON invoice.job_number=item_records.job_number  
GROUP BY

        invoice.id   

示例数据:

我的职位编号HAWB MAWB
1 | 200001 | a1,a2,a3 | B2,B3
2 | 200002 | a7,a8,| B1
3 | 255544 | a11 | b4

在这种情况下我在ID的总数之后,但我从每一行获得HAWB / MAWB的总数。

2 个答案:

答案 0 :(得分:1)

您需要在子查询中执行聚合,您当前正在做的是导致交叉连接,因此如果job_lines中有2条记录,item_records中有2条记录用于特定发票ID,你最终得到了4行,涵盖了所有4种组合。

SELECT  jl.Count + ir.Count AS Count,
        i.id,
        IFNULL(jl.JobLines, ''),
        IFNULL(ir.MAWB, '') AS MAWB AS JobLines,
        IFNULL(ir.HAWB, '') AS HAWB
FROM    Invoice AS i
        LEFT JOIN
        (   SELECT  taken, 
                    GROUP_CONCAT(job_number SEPARATOR ' ') AS JobLines,
                    COUNT(*) AS Count
            FROM    job_lines
            GROUP BY taken
        ) AS jl
            ON jl.taken = i.id
        LEFT JOIN
        (   SELECT  job_number, 
                    GROUP_CONCAT(item_records.MAWB SEPARATOR ' ') AS MAWB,
                    GROUP_CONCAT(item_records.HAWB SEPARATOR ' ') AS HAWB,
                    COUNT(*) AS Count
            FROM    item_records
            GROUP BY job_number
        ) AS ir
            ON ir.job_number = i.job_number;

N.B。 MySQL实现子查询,即在首次引用子查询时执行一次子查询,并将结果存储在哈希临时表中,并每次从中查找。因此,如果您有一个WHERE子句,这意味着只返回了有限数量的发票,那么将整个job_lines表汇总到一个临时表中只会使用一些记录是低效的。如果是这种情况,那么Thorsten的答案将更有效率,但是如果您查询大量的发票表,那么不必使用DISTINCT撤消交叉连接应该证明更有效。

答案 1 :(得分:0)

您计算每张invoice.id的已加入记录。因此,如果您有发票ID 5个作业行和3个项目记录,则得到5 x 3 = 15。

如果您只想要作业行数,请使用COUNT(DISTINCT job_lines.id)

如果您只想要项目记录的数量,请使用COUNT(DISTINCT item_records.id)