我目前正在编写一个查询来搜索三个表(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的总数。
答案 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)
。