【问题标题】:MySQL return inverse? Results of a search or results NOT containingMySQL返回逆?搜索结果或结果不包含
【发布时间】:2012-09-28 23:47:38
【问题描述】:

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

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

我是我的形象,你可以看到 Tickets.id 有 174 反对它,这也显示在 Labels.ticket_id 174 与 2 x Labels 反对它。

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

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

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

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

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

非常感谢!

【问题讨论】:

    标签: mysql select key where-clause


    【解决方案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 
    

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

    【讨论】:

    • 我也试试看!谢谢...这已经让我发疯了好几个小时了!
    • 如果labels_tickes.ticket_id 包含NULL 值,这将返回不正确的结果。如果可能的话,则应将where ticket_id is not null 添加到子选择中。
    • 这似乎有效。我已经更改了上面的查询以反映我的一个标签以及空值!非常感谢。
    【解决方案2】:

    以下获取所有没有 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 by 和having 进行此类集合成员类型查询。它很容易推广到标签存在或不存在的任意组合。

    【讨论】:

    • 设法让它与阿布的答案一起工作。非常感谢您的帮助!
    【解决方案3】:

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

    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

    【讨论】:

    • 我认为.. 从它的外观.. 工作!我也尝试了左外连接并搜索了 null !我要进行一些测试,如果一切顺利,我会接受作为答案!谢谢!
    • 这很接近了!它确实返回“标签”表中未列出的所有票证......但没有给我过滤标签数据库中关键字的选项,例如“稍后回顾”.. 我现在正在考虑如何添加 AND 或 OR 或其他东西来做到这一点?
    • 你好,于尔根。我仍然没有任何运气,但可能我错误地重新编写了您的查询,所以我在上面发布了我对您的查询的看法。查询确实运行,但返回 0 个结果。
    • 设法让它与阿布的答案一起工作。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多