【问题标题】:Mysql join, negative condition to exlude resultsMysql join,否​​定条件排除结果
【发布时间】:2020-10-15 03:31:06
【问题描述】:

我有一个user 表和一个item 表,我可以在其中为每个用户分配多个项目。我需要一个简单的查询,它将选择所有没有分配特定类型项目的用户。

我的查询的问题是,如果某个用户分配了多个项目,比如 100200300,他们仍然会被选中,因为他们分配了类型为 100200 的项目。我想要的是完全排除所有已分配项目 300 的用户,而不管他们可能已分配的任何其他项目。

我发现类似的 question 有答案,但它处理不同的关系类型 (MtM),我在将答案翻译为我的特定案例时遇到了问题。

我的不完整查询需要扩展

SELECT * FROM user
LEFT JOIN item
ON user.id = item.assigned_to_id 
WHERE item.id is null OR item.type != 300

查询正常,但有一个子查询,我想避免这种情况

SELECT * FROM user
WHERE user.id NOT IN 
(
SELECT i.assigned_to_id 
FROM item i 
WHERE i.type = 300 
AND i.assigned_to_id is not null
)

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
  • 这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
  • @AkhileshMishra 在代码字体用于非代码的情况下,阅读材料很快就会变得困难,即在阅读时碰巧出现在代码中的单词/名称不是代码,而仅仅是命名事物。而且这种风格是用还是用,完全是个人喜好问题,编辑别人的帖子这样做是不合适的;如果一个这样的编辑是合理的,那么每个帖子都可以不断地在风格之间来回编辑。因此,请将您的风格选择保留在您自己的帖子中,并以自己的风格保留帖子。代码使用代码字体。
  • 永远不要使用邪恶的SELECT *。相反,只命名和限定您实际希望返回的列。

标签: mysql join left-join


【解决方案1】:

只需将子查询的条件放到Left Join 条件中,并在item 表的id 字段中添加where 子句以检查null

您可以使用left join 编写等效查询,如下所示。

select
u.*
from user u
left join item i on u.id=i.assigned_to_id and i.type=300
where i.id is null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多