MySQL返回逆?搜索结果或结果不包含

时间:2012-10-08 17:30:04

标签: mysql select key where

这里有一个复杂的? (对我来说至少)。我有一个名为“ticket”的表,其中“id”列是唯一键。我有另一个名为“标签”的表,它没有唯一的密钥(从它的外观)。在“门票”中,我们存储票务信息(消息,制作票证等)。我们可以在创建故障单时为其添加标签,以便我们可以使用这些标签搜索故障单,例如“稍后回顾”。

我正在尝试做的是反向类型查询,例如告诉我所有没有与之相关的特定标签的门票,例如请不要给我看任何“稍后回顾”的门票。如果门票没有任何标签,则无法放入标签表中。我无法通过手工或查询构建器来编写任何类型的查询。

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

无论查询,加入,做什么,不做等我尝试,我要么得不到结果,要么出于某种奇怪的原因,我仍然会收到174张票。

这是我尝试过的最简单的查询。但是,我认为我现在尝试了从简单到非常复杂的大约30次迭代。

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

任何人都可以建议为什么这不起作用或想出任何方法来建立一个说明的陈述:

在标签表中显示没有标签“MyLabel”或根本没有值的门票显示所有门票。

非常感谢!

3 个答案:

答案 0 :(得分:1)

    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 

尝试这个我认为它会起作用。

答案 1 :(得分:0)

您可以执行outer join并仅选择ticket_id表中未找到labels_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

请参阅this JOIN examples

答案 2 :(得分: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 byhaving进行此类设置 - 成员资格类型查询。它很容易推广到标签存在与否的任意组合。