我将描述(希望所有)重要的部分:
我有一张表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
它产生了这个结果:
但如果我将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
知道它可能是什么,或者我该如何正确地做到这一点?
PS。我刚刚注意到t.state也没有得到count(*)
答案 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