You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:27:47