我有三张桌子。门票,门票历史和分类。我想算一下员工已经完成了多少票,但按分类细分了。
例如,员工A处理了3张票。前两张票被归类为错误,最后一张是特色。我想查询数据库并选择员工更改故障单状态的所有故障单。
这样的事情:
Bug ..... 2
特征...... 1
UI ..... 0
请求..... 0
现在,我能得到的就是:
Bug ..... 2
特征...... 1
使用此查询:
SELECT c.id, c.description, count(c.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id
WHERE th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id
我创建了一个SQL Fiddle with sample data,但还没有设法找到解决方案。
答案 0 :(得分:3)
第一个问题是,classification
表中的所有行都不会被选中,而只会选择其他两个表中具有相应条目的行。那是因为您已经在WHERE子句中放置了一些依赖于这些表中的条目的条件。基本上,你正在进行LEFT JOIN以解决这个问题,但是通过将条件放在WHERE而不是LEFT JOIN ... ON中来破坏这个问题。
第二个问题是,当你真正想要门票的数量时,你计算分类的数量,对吧?因此,将count(c.id)
更改为count(t.id)
以获得正确的数字。
SELECT c.id, c.description, count(t.id)
FROM classification c
LEFT JOIN ticket t on t.classification_id = c.id
LEFT JOIN ticket_history th on th.ticket_num = t.id
AND th.employee = '456'
AND th.from_state = '2' AND th.to_state = '3'
GROUP BY c.id
ORDER BY c.id;