mysql - 使用 if 条件从两个表中进行选择的 SQL 查询

标签 mysql sql select

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

Tables: Notification        Acknowledgment

fields: id, notifier        id, parent_id, status

现在我必须从通知中选择行,以便:

  1. 没有确认 WHERE Acknowledment.parent_id = notification.id (对于该特定通知基本上没有确认) //或者
  2. 如果有通知确认,则在任何parent_id = Notification.id 的确认具有 Acknowledgment.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"

我可以将其分解为更简单的查询并实现这一目标,但我很想知道一个查询来完成此任务..

最佳答案

作为 LEFT OUTER JOINS 的替代方案,您可以使用 the EXISTS clause .

举个例子:

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 在 SQL 中往往会得到更好的优化(特别是在我的示例中,您在同一个表上使用多个连接),我只是提到这种替代方案,因为它是一种更有效的方法。直接翻译您的伪查询。

关于mysql - 使用 if 条件从两个表中进行选择的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569637/

相关文章:

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 '?' 附近使用的正确语法

mysql - Laravel - 具有关系多行的 SQL 查询

javascript - 从调度程序填充 Azure 移动服务

mysql - Mysql跨库触发器

MySQL 无法创建允许远程连接的用户

java - 子查询返回空结果集的PreparedStatement

javascript - 在select中设置选中项

sql-server - 如何选择 X 随机行,同时保证 Y 某些特定行出现在结果中?

mysql - 为什么我们不应该在生产服务器上的 mysql 查询中使用 Select *?

MySQL查询以选择全部或部分搜索字符串