COUNT(*)中未遵守LEFT JOIN条件

时间:2015-01-20 17:15:18

标签: mysql sql

我将描述(希望所有)重要的部分:

我有一张表sup_tickets,其中包含所有票证,可以标记这些tickets。关系为M:N,中间表为sup_labels2tickets

如果没有故障单显示0的标签,我希望计算表sup_tickets中每个对应label的所有故障单。不要忽略第二个图像上显示的输出。

标签也会分配给特定的队列,并且故障单也会分配给特定的队列,但有时会出现故障单位于与故障单本身不在同一队列中的标签。

我想出了这两个查询,第一个查询中的问题是2nd LEFT JOIN不尊重t.queue_id = @queue_id,如果票证位于与相应标签不同的队列中,则返回不准确的结果。

第一个几乎起作用:

SELECT COUNT(l2t.id) AS `count`, l.name, l.id, l.priority FROM sup_labels AS l
LEFT JOIN sup_labels2tickets AS l2t ON l.id = l2t.label_id
LEFT JOIN sup_tickets as t ON t.id = l2t.ticket_id AND t.queue_id = @queue_id AND t.state = @state
WHERE l.queue_id = @queue_id
GROUP BY l.id

它产生了这个结果:

Resultset 1

但如果我将t.queue_id = @queue_id移到WHERE语句中,它会省略0计数的标签。

SELECT COUNT(l2t.id) AS `count`, l.name, l.id, l.priority FROM sup_labels AS l
LEFT JOIN sup_labels2tickets AS l2t ON l.id = l2t.label_id
LEFT JOIN sup_tickets as t ON t.id = l2t.ticket_id AND t.state = @state
WHERE l.queue_id = @queue_id AND t.queue_id = @queue_id
GROUP BY l.id

Resultset 2

知道它可能是什么,或者我该如何正确地做到这一点?

PS。我刚刚注意到t.state也没有得到count(*)

的尊重

2 个答案:

答案 0 :(得分:0)

尝试在第一个查询中将SELECT COUNT(l2t.id)更改为SELECT COUNT(t.id) - 如果要查看从外部联接表成功返回的记录数,则需要查询(非空)数据项来自该表

答案 1 :(得分:0)

这样:

SELECT COUNT(t.id) AS `count`, l.name, l.id FROM sup_labels AS l
LEFT JOIN sup_labels2tickets AS l2t ON l.id = l2t.label_id
LEFT JOIN sup_tickets as t ON t.id = l2t.ticket_id AND t.queue_id = @queue_id  AND t.state = @state
where l.queue_id = @queue_id
GROUP BY l.id

工作小提琴:http://sqlfiddle.com/#!2/e210ae/2