Mysql 计数(*)中不考虑左连接条件
我将描述(希望是所有)重要的方面: 我有一张桌子,里面有所有的票,这些票可以贴上标签。关系是Mysql 计数(*)中不考虑左连接条件,mysql,sql,Mysql,Sql,我将描述(希望是所有)重要的方面: 我有一张桌子,里面有所有的票,这些票可以贴上标签。关系是M:N,中间的表是sup_labels2tickets 如果没有票务显示的标签,我想获得表中每个相应标签的所有票务计数sup_tickets。不要忽略第二个图像上显示的输出 标签也分配给特定队列,票证也分配给特定队列,但有时票证所在的标签与票证本身不在同一队列中 我提出了这两个查询,第一个查询中的问题是2nd LEFT JOIN不尊重t.queue\u id=@queue\u id,如果票证位于与相应标签
M:N
,中间的表是sup_labels2tickets
如果没有票务显示的标签,我想获得表中每个相应标签的所有票务计数sup_tickets
。不要忽略第二个图像上显示的输出
标签也分配给特定队列,票证也分配给特定队列,但有时票证所在的标签与票证本身不在同一队列中
我提出了这两个查询,第一个查询中的问题是2nd LEFT JOIN
不尊重t.queue\u id=@queue\u 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\u id=@queue\u 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
你知道这可能是什么,或者我应该如何正确地做到这一点吗
另外,我刚刚注意到,在第一次查询中,t.state对
count(*)
尝试将SELECT count(l2t.id)
更改为SELECT count(t.id)
,如果要查看从外部联接表成功返回的记录数,需要查询a(非空)该表中的数据项。这样:
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
工作小提琴:将
和t.queue\u id=@queue\u id
从打开
条件移动到WHERE
子句有效地将左连接
更改为普通的连接
(因为它强制t.queue\u id
不为空)@joop我不知道它是否相关,但是除了l2t.ticket\u id
=33或34的记录外,所有票据都设置了队列id(不为空);这些在表sup\u tickets
@joop中根本不存在。这是真的,你有什么建议吗。我看不清答案。