Mysql SQL查询,从具有if条件的两个表中进行选择

Mysql SQL查询,从具有if条件的两个表中进行选择,mysql,sql,select,Mysql,Sql,Select,我有两张表格,通知和确认。确认有一个保存通知表主键的字段。基本上,一个通知会有很多确认 Tables: Notification Acknowledgment fields: id, notifier id, parent_id, status 现在,我必须从通知中选择行,以便: Acknowledment.parent_id=Notification.id时没有确认(基本上没有对特定通知的确认) //或 如果存在通知的确认,则如果父项_id=Notificati

我有两张表格,通知和确认。确认有一个保存通知表主键的字段。基本上,一个通知会有很多确认

Tables: Notification        Acknowledgment

fields: id, notifier        id, parent_id, status
现在,我必须从通知中选择行,以便:

  • Acknowledment.parent_id=Notification.id时没有确认(基本上没有对特定通知的确认) //或
  • 如果存在通知的确认,则如果父项_id=Notification.id的任何确认具有确认。status=someValue,则选择通知
  • 伪SQL代码:

       "SELECT * FROM Notification (WHERE id is not present in Acknowledgment.parent_id) OR
       (WHERE id is present in Acknowledgment.parent_id AND Acknowledgment.status=@someValue"
    

    我可以将其分解为更简单的查询并实现这一点,但我很想知道一个查询来实现这一点。

    作为
    左侧外部联接的替代方法,您可以使用

      SELECT    * 
        FROM    Notification n
                LEFT OUTER JOIN Acknowledgment a ON a.parent_id = n.id
      WHERE     (a.parent_id IS NULL OR a.status = @somevalue)
    
    例如:

    SELECT *
    FROM Notification n
    WHERE NOT EXISTS (
       SELECT *
       FROM Acknowledgement
       WHERE parent_id = n.id
    ) OR EXISTS (
       SELECT *
       FROM Acknowledgement
       WHERE parent_id = n.id AND status = @someValue
    )
    

    JOIN
    s在SQL中往往会得到更好的优化(特别是在我的示例中,您在同一个表上使用了多个连接的情况下),我只提到这个替代方法,因为它更直接地转换了您的伪查询。

    作为
    左侧外部连接的替代方法,您可以使用

    例如:

    SELECT *
    FROM Notification n
    WHERE NOT EXISTS (
       SELECT *
       FROM Acknowledgement
       WHERE parent_id = n.id
    ) OR EXISTS (
       SELECT *
       FROM Acknowledgement
       WHERE parent_id = n.id AND status = @someValue
    )
    

    JOIN
    s在SQL中往往会得到更好的优化(特别是在我的示例中,您在同一个表中使用了多个表的情况下),我只提到这个替代方法,因为它是对伪查询的更直接的翻译。

    谢谢。。这是不同的,更简单,但更详细。谢谢你让我知道这些关键词。记住银行更容易。。这是不同的,更简单,但更详细。谢谢你让我知道这些关键词。比较容易理解remember@Akhil的答案在代码中有a.id为NULL而不是a.status。既然不会有这样的争吵,你也可以这样做吗?@Akhil,你为什么要更新,而这对结果完全没有影响?:)实际上,除非status是不可为NULL的列,否则不能假定a.status为NULL。如果可以为空,则可能会有一个带有父id但没有状态的确认。在这种情况下,您的逻辑可能不起作用@阿基尔,马上!虽然在我的情况下,状态不会为空。无论如何,我会把你的答案标记为快了几秒钟。@nawfal因为你的状态无论如何都不可为空,每个人都是对的:)@Akhil的答案在你的代码中有a.id为空而不是a.status。既然不会有这样的争吵,你也可以这样做吗?@Akhil,你为什么要更新,而这对结果完全没有影响?:)实际上,除非status是不可为NULL的列,否则不能假定a.status为NULL。如果可以为空,则可能会有一个带有父id但没有状态的确认。在这种情况下,您的逻辑可能不起作用@阿基尔,马上!虽然在我的情况下,状态不会为空。无论如何,我会为你的答案打上分数,因为你的回答快了几秒钟。@nawfal因为你的状态无论如何都是不可为空的,每个人都是对的:)