2

这里复杂吗?(至少对我来说)。我有一个名为 的表ticketsid列是唯一键。我有另一个名为 的表Labels,它没有唯一键(从外观上看)。在Tickets我们存储门票信息(消息,谁制作门票等)。我们可以在创建工单时为其添加标签,以便我们可以搜索具有这些标签的工单,例如“稍后查看”。

我正在尝试做的是反向类型查询,例如向我显示所有没有与之关联的特定标签的票,例如不要向我显示任何带有“稍后查看”的票。如果票没有任何标签,则标签表中没有任何内容。我无法手动或使用查询构建器编写任何类型的查询。

我是我的图像,你可以看到Tickets.id它有 174 个,它也显示在Labels.ticket_id 174它上面设置了 2 个标签。

无论我尝试什么查询、加入、执行、不执行等,我要么没有得到任何结果,要么由于某种奇怪的原因,我仍然会ticket 174出现。

这是我尝试过的最简单的查询......但是,我想我已经尝试了大约 30 次迭代,从简单到非常复杂。

SELECT tickets.id
FROM
  tickets, labels_tickets
WHERE
  tickets.id <> labels_tickets.ticket_id
GROUP BY
  tickets.id

任何人都可以提出为什么这不起作用或想出任何方法来建立一个声明:

显示标签表中没有标签“MyLabel”或根本没有值的所有tickets.id。

非常感谢!

4

3 回答 3

2
    SELECT tickets.id 
    FROM 
      tickets 
    WHERE 
      tickets.id NOT IN (SELECT ticket_id from labels_tickets where labels_tickets.label = 'out of hours' or labels_tickets.label = null) 
    GROUP BY 
      tickets.id 

试试这个,我认为它会工作。

于 2012-10-08T17:35:32.303 回答
0

您可以执行 a并仅选择表中未找到outer join的票证。ticket_idlabels_tickets

SELECT t.id
FROM tickets t
LEFT OUTER JOIN labels_tickets l ON t.id = l.ticket_id
WHERE l.ticket_id IS NULL
GROUP BY t.id
HAVING sum(l.label = 'review later') = 0

请参阅此 JOIN 示例

于 2012-10-08T17:31:56.787 回答
0

以下获取所有没有 ReviewLater 标签的工单:

SELECT lt.ticket_id
FROM labels_tickets
group by lt.ticket_id
having sum(case when label = 'ReviewLater' then 1 else 0 end) = 0

这会将所有标签视为一个组。总和计算具有所需标签的数字。你想要这个计数为 0 的那些。

我强烈建议对此类集合成员类型查询使用group byand having。它很容易推广到标签存在或不存在的任意组合。

于 2012-10-08T17:35:11.627 回答