【问题标题】:How do I select rows from a table that do not have corresponding rows in a related table?如何从表中选择相关表中没有对应行的行?
【发布时间】:2013-01-01 12:07:23
【问题描述】:

我有两个 MySQL 表:

  • alerts
  • alerts_viewed

Alerts 是一个表,其中包含有关警报的基本信息,alerts_viewed 表包含有关已查看警报的信息(按用户 ID 和警报 ID):

alerts_viewed 上的字段是:

  • 身份证
  • alert_id(FK 到警报表)
  • user_id(FK 到用户表)
  • is_hidden

基本上,我知道如果我只想从警报中选择在alerts_viewed 中有相应行的行,我可以进行 INNER JOIN。我只是不知道怎么做。

如何从alerts 表中选择在alerts_viewed 表中没有对应行的所有行?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    使用LEFT JOIN

    SELECT  a.*
    FROM    alerts a
            LEFT JOIN alerts_viewed b
                ON a.alert_id = b.alert_id
    WHERE   b.alert_id IS NULL
    

    【讨论】:

      【解决方案2】:
      select * from alerts
      where id not in (select alert_id from alert_viewed)
      

      select a.* from alerts a
      left outer join alert_viewed av on a.id = av.alert_id 
      where av.alert_id is null
      

      【讨论】:

      • 不会导致两个查询吗?
      【解决方案3】:

      除了 JW 和 Juergen 的回答之外,我想提出另一种方法

      不存在

      select * from alerts aa
      where not exists
         (select alert_id 
         from alert_viewed av
         where av.alert_id=aa.id
         )
      

      【讨论】:

      • 好主意,除了语法错误:子查询应该与外部查询相关:WHERE NOT EXISTS (SELECT * FROM alert_viewed av WHERE a.id = av.alert_id )
      • 抱歉纠正你。这个想法很糟糕,但语法不正确。
      • 这是我的荣幸兄弟。我不会再犯这个错误了。这是共同相关的查询。现在我明白了它是如何工作的..
      猜你喜欢
      • 2014-05-07
      • 2017-08-29
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2014-01-18
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多