如何用MySQL从两张表筛选行?我的查询语句存在哪些问题?
你的SQL查询语句存在以下几个关键问题:
1. SQL语法结构错误
- WHERE子句位置错误:SQL语法要求
JOIN子句必须在WHERE过滤条件之前,你在INNER JOIN前就写了第一个WHERE,会直接导致语法报错。 - 重复使用WHERE子句:一个SELECT语句只能有一个
WHERE子句,你写了两个WHERE,这也是语法错误,所有过滤条件需要合并到同一个WHERE中。
2. 过滤条件逻辑错误
- 错误的匹配条件:
table2.postID=:userID完全不符合业务逻辑,你应该匹配table2.userID=:userID(确保两张表的用户ID一致)。 - 过滤条件与预期结果冲突:你设置
table2.remove=:remove的值为1,但预期结果包含了table2.remove=0的postID=3数据,这个条件会直接排除这条符合要求的数据。 - 传入的userID值错误:你设置
$userID = 12,但预期结果对应的是userID=3的数据,这会导致查询不到任何符合条件的内容。
3. 缺少必要返回字段
预期结果需要返回postID,但你的SELECT语句中没有包含这个字段,需要补充。
修正后的PHP+PDO代码
$userID = 3; // 修正为预期结果对应的userID $active = 1; // 如果不需要过滤remove状态,可删除$remove变量及对应条件 $remove = 0; $sql = "SELECT table1.postID, table1.status, table1.number, table2.reference, table2.joint_date FROM table1 INNER JOIN table2 ON table1.postID = table2.postID WHERE table1.active = :active AND table1.userID = :userID AND table2.userID = :userID AND table2.remove = :remove -- 不需要过滤remove时,删除此行 ORDER BY table1.postID DESC"; $stmt = $this->pdo->prepare($sql); $stmt->bindValue(":active", $active, PDO::PARAM_INT); $stmt->bindValue(":userID", $userID, PDO::PARAM_INT); // 删除remove条件时,同时删除此行绑定 $stmt->bindValue(":remove", $remove, PDO::PARAM_INT); $stmt->execute();
若不需要过滤table2.remove的状态,直接删除AND table2.remove = :remove语句及对应的变量绑定,即可得到你想要的预期结果。
内容的提问来源于stack exchange,提问作者Kyv
相关产品推荐
相关产品推荐

