我有两个表“通知”和“确认”。确认有一个字段保存通知表的主键。基本上一个通知会有很多确认。
Tables: Notification Acknowledgment
fields: id, notifier id, parent_id, status
现在我必须从通知中选择行,以便:
- 没有确认 WHERE Acknowledment.parent_id = notification.id (对于该特定通知基本上没有确认) //或者
- 如果有通知确认,则在任何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/