mysql select 和几个条件,但如果第一个不满足,则满足第二个

标签 mysql

我这里有两个表,第一个是客户表,第二个是政策表。政策可以有多种状态 - 有效、无效、已取消等。

现在,我需要选择客户和他们的有效政策,只有在有效政策不存在时才取消政策!

应该是这样的

SELECT c.customer_id, p.policy_id 
FROM table_customer as c
INNER JOIN table_policy as p ON c.customer_id = p.customer_id
WHERE p.status = 'active' OR p.status = 'cancelled' 
//(but select cancelled only if there are no active)

这可以在一次查询中完成吗?

提前致谢。

最佳答案

要检查某物是否不存在,您可以使用 not exists ,它检查(依赖)子查询是否(不)为空:

SELECT c.customer_id, p.policy_id 
FROM table_customer as c
INNER JOIN table_policy as p ON c.customer_id = p.customer_id
WHERE p.status = 'active' 
   OR (p.status = 'cancelled' 
       AND NOT EXISTS (SELECT 1 FROM table_policy as p1 
                       WHERE p1.customer_id = p.customer_id 
                       AND p1.status = 'active'))

这可以很方便地直接理解为选择客户及其有效政策和取消的政策(仅当[此客户的]有效[政策]不存在时)

可能只是对 select 1 中的 1 的注释:因为你选择什么并不重要,只要有东西就在那里,1 只是一个方便的选择。

关于mysql select 和几个条件,但如果第一个不满足,则满足第二个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778198/

相关文章:

php - PHP 中的 mysqli 类是否可以 100% 防止 sql 注入(inject)?

php - 从mysql获取今天访问的所有时间的不同ip

php - 关系数据库设计: User lists

mysql - 如何检查数据库是否包含 Ruby on Rails 中的值?

php - 用户注册时创建 MySQL 表

php - 使用LOAD DATA LOCAL INFILE将CSV添加到MySQL数据库时出现问题

mysql - Rails 应用程序中连接远程数据库服务器失败

php - 有没有简单的方法来重复 php mysql 查询?

mysql - 如何自定义插入数据?

mysql - UTF-8 和 ISO-8859-1 的区别