mysql中where+if判断

本文介绍了一种在MySQL中实现基于用户角色的动态数据查询方法,通过使用IF判断和多重条件筛选,实现了根据不同角色查看特定类型的好友动态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mysql中where中多重条件if判断,项目需求如下:
好友关系中本身具有A,B,C三种角色,好友动态分为1,2,3,4,5种类型。A是必须具有的角色,如果具有A角色可查好友动态类型1,3,4 的信息如果具有B角色可查2类型信息,如果具有C角色可查5类型角色。
实现思想如下:先查出好友关系所有动态数据-》判断B角色增加筛选2类型-》判断C角色增加筛选5类型
下面说说实现步聚,具体添加的数据不在这里说明了。
1.增加关系表

SQL Code复制内容到剪贴板
  1. --  
  2. -- 表的结构 `表A`  
  3. --  
  4.   
  5. CREATE TABLE IF NOT EXISTS `表A` (  
  6.   `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '关注ID',  
  7.   `user_id` int(11) NOT NULL COMMENT '用户名ID',  
  8.   `user_follow_id` int(11) NOT NULL COMMENT '被关注用户ID',  
  9.   `iscarer` tinyint(2) NOT NULL DEFAULT '0' COMMENT '角色A关注为好友1是0否2忽略',  
  10.   `ishelper` tinyint(2) NOT NULL DEFAULT '0' COMMENT '角色B关注师傅1是0否2忽略',  
  11.   `issupplier` tinyint(2) NOT NULL DEFAULT '0' COMMENT '角色C关注服务商1是0否2忽略',  
  12.   `insert_time` varchar(20) NOT NULL COMMENT '增加时间',  
  13.   PRIMARY KEY (`uid`)  
  14. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='用户关系关注表' AUTO_INCREMENT=21 ;  

2.增加好友动态表

SQL Code复制内容到剪贴板
  1. --  
  2. -- 表的结构 `表B`  
  3. --  
  4.   
  5. CREATE TABLE IF NOT EXISTS `表B` (  
  6.   `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '消息ID',  
  7.   `type` tinyint(4) NOT NULL COMMENT '用类型 1车主文章2,关注文章,3提问,4,调查,5订单信息',  
  8.   `user_id` int(11) NOT NULL ,  
  9.   `event_message` text NOT NULL COMMENT '动态数据序列化',  
  10.   `insert_time` varchar(20) NOT NULL,  
  11.   PRIMARY KEY (`uid`)  
  12. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='好友动态表' AUTO_INCREMENT=3 ;  


3.好友动态总记录如下:
sql如下:

SQL Code复制内容到剪贴板
  1. SELECT  
  2.     *  
  3. FROM  
  4.     表A f  
  5. LEFT JOIN(  
  6.     SELECT  
  7.         type,  
  8.         user_id AS author_id,  
  9.         event_message  
  10.     FROM  
  11.         表B 
  12. )e ON f.user_follow_id = e.author_id  
  13. WHERE  
  14. user_id = 275  
  15. AND iscarer = 1  
  16. AND type IS NOT NULL  

结果3条数据如下:

4.加上B角色去判断sql如下:

SQL Code复制内容到剪贴板
  1. SELECT  
  2.     *  
  3. FROM  
  4.     表A f  
  5. LEFT JOIN(  
  6.     SELECT  
  7.         type,  
  8.         user_id AS author_id,  
  9.         event_message  
  10.     FROM  
  11.         表B 
  12. )e ON f.user_follow_id = e.author_id  
  13. WHERE  
  14. IF(ishelper = 0, type <> 2, '1=1')  
  15. AND user_id = 275  
  16. AND iscarer = 1  
  17. AND type IS NOT NULL  

结果2条数据如下:

4.加上C角色去判断sql如下:

SQL Code复制内容到剪贴板
  1. SELECT  
  2.     *  
  3. FROM  
  4.     表A f  
  5. LEFT JOIN(  
  6.     SELECT  
  7.         type,  
  8.         user_id AS author_id,  
  9.         event_message  
  10.     FROM  
  11.         表B 
  12. )e ON f.user_follow_id = e.author_id  
  13. WHERE  
  14.   
  15. IF(ishelper = 0, type <> 2, '1=1')  
  16. AND  
  17. IF(issupplier = 0, type <>5, '1=1')  
  18. AND user_id = 275  
  19. AND iscarer = 1  
  20. AND type IS NOT NULL  

结果1条数据如下:

好了,达到了想要的效果了。
PS:后面where是可以根据索引值来条件先后顺序

SQL Code复制内容到剪贴板
  1. WHERE  
  2. user_id = 275  
  3. AND iscarer = 1  
  4. AND type IS NOT NULL  
  5. AND  
  6. IF(ishelper = 0, type <> 2, '1=1')  
  7. AND  
  8. IF(issupplier = 0, type <>5, '1=1')  
### 使用 IF 函数或 CASE 表达式在 MySQL 查询中的 WHERE 子句实现条件判断 #### 使用 IF 函数 IF 函数允许根据指定的条件返回两个不同的值。然而,需要注意的是,在标准 SQL 中 `WHERE` 子句不支持直接使用 `IF()` 函数来进行复杂的逻辑操作;通常情况下,`IF()` 更适合用于 `SELECT` 或者其他上下文中。 对于简单的真/假测试可以直接利用布尔运算符和表达式完成相同的功能: ```sql SELECT * FROM table_name WHERE IF(column_name > value, true_condition, false_condition); ``` 但是更推荐的方式是在 `WHERE` 子句中直接应用比较运算符[^1]。 #### 使用 CASE 表达式 相比之下,CASE 表达式更加灵活且适用于复杂场景下的多分支决策结构。它可以被放置于任何允许表达式的部分,包括但不限于 `WHERE` 子句内。以下是具体的应用方式: ```sql SELECT * FROM table_name WHERE CASE WHEN column_name = 'value1' THEN expression_or_value_for_true_case_1 WHEN column_name = 'value2' THEN expression_or_value_for_true_case_2 ELSE default_expression_or_value END; ``` 这种形式使得可以根据多个不同条件动态调整查询行为,而无需依赖外部编程语言来构建动态SQL语句[^3][^5]。 为了使上述例子更具实用性,假设有一个名为 orders 的订单表,并希望筛选出特定状态(status)下满足一定金额范围内的记录,则可以这样写: ```sql SELECT order_id, customer_id, total_amount, status FROM orders WHERE CASE WHEN status = 'pending' AND total_amount BETWEEN 0 AND 100 THEN TRUE WHEN status = 'completed' AND total_amount >= 200 THEN TRUE ELSE FALSE END; ``` 这段代码会选出所有处于 "pending" 状态并且总金额介于 0 到 100 之间或者是已完成 (completed) 并且总额大于等于 200 的订单[^4].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值