mysql - COUNT(*) 中不遵守 LEFT JOIN 条件

标签 mysql sql

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

我有一个表sup_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(*)

最佳答案

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

关于mysql - COUNT(*) 中不遵守 LEFT JOIN 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28051306/

相关文章:

Visual Studio 上的 MySql 更新参数有奇怪的行为

PHP 多个带有分隔表的下拉框

sql - 使用条件递归 SQL/基于条件创建列

sql - 为什么子查询在teradata中不起作用?

mysql - 为什么文本列在 MySQL 中不能有默认值?

php - PDO 如何返回已执行查询的总数

mysql - 从随机名称表中更新 SQL

mysql - 更新多个值的 SQL 查询

php - 如何回显 SQL 表中的所有内容?

c# - MySQLConnection 在 Visual Studio 中抛出异常