MySQL查询state字段值为1和2的行的正确写法求助
解决SQL查询state值为1和2的问题
嘿,我来帮你搞定这个查询问题!你的两个写法都有语法或逻辑问题,我给你拆解一下正确的做法:
基础SQL写法
首先,你第一个尝试的SELECT * FROM db WHERE state = 1 or 2;是错误的——OR运算符需要两边都是完整的比较条件,or 2会被SQL当成布尔值(2在SQL里视为true),所以这条语句实际上会返回所有行,完全不符合你的需求。
正确的基础写法有两种:
- 使用OR连接完整条件:
SELECT * FROM db WHERE state = 1 OR state = 2;
- 更简洁的IN子句(适合多个值的场景):
SELECT * FROM db WHERE state IN (1, 2);
PHP结合数组的写法
你第二个尝试直接把PHP数组代入SQL是行不通的,因为SQL无法识别PHP的数组类型,会导致语法错误。这里分两种情况处理:
情况1:state是数字类型(你的场景)
可以把数组转成逗号分隔的数字字符串,同时注意防止SQL注入(因为是数字,用intval转义很安全):
$select_state = array(1, 2); // 把数组元素转成整数后拼接成字符串 $state_list = implode(',', array_map('intval', $select_state)); $sql = "SELECT * FROM db WHERE state IN ($state_list);";
情况2:state是字符串类型(拓展参考)
如果state是字符串,一定要用预处理语句来避免注入风险,比如用PDO:
$select_state = array('1', '2'); // 生成对应数量的占位符 $placeholders = implode(',', array_fill(0, count($select_state), '?')); // 预处理SQL $stmt = $pdo->prepare("SELECT * FROM db WHERE state IN ($placeholders)"); // 绑定数组并执行 $stmt->execute($select_state); // 获取结果 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
查找解决方案的途径
如果以后遇到类似问题,可以试试这些方向:
- 搜索关键词:比如「SQL IN 子句用法」「PHP 数组传入 SQL 查询」「SQL 多值匹配」
- 查看官方文档:MySQL官方文档里关于
IN运算符的说明,PHP官方文档里PDO/mysqli的预处理语句部分 - 在技术社区提问时,尽量贴出完整的错误信息(比如数据库返回的报错内容),这样更容易得到精准的帮助
内容的提问来源于stack exchange,提问作者Nol




