PHP中SQL内连接查询帖子时按updated_at排序执行失败如何解决
问题分析
- 核心语法错误:你将独立的SELECT查询语句直接作为表名拼接进主查询,既没有用括号包裹子查询,也没有为子查询设置别名,SQL解析器无法识别该结构,直接抛出异常
- 逻辑冗余:不需要先对microposts表单独排序再做关联,内连接完成后直接对结果集排序,完全能实现按帖子更新时间倒序的需求,执行效率更高
最优修改方案
直接在原有可运行的SQL语句末尾添加排序规则即可,修改后完整代码如下:
$query = "SELECT * FROM users INNER JOIN microposts ON users.id = microposts.user_id ORDER BY microposts.updated_at DESC"; $result = mysqli_query($db, $query) or trigger_error("Query Failed! SQL: $query - Error: ".mysqli_error($db), E_USER_ERROR); $n = mysqli_num_rows($result); for ( $i = 0; $i < $n; $i++){ $posts[$i] = mysqli_fetch_assoc($result); }
子查询写法(仅做参考,不推荐)
如果你确实需要先排序再关联的逻辑,正确的子查询写法需要用括号包裹查询语句并设置别名,修改后代码如下:
$ordered = "(SELECT * FROM microposts ORDER BY updated_at DESC) AS m"; $query = "SELECT * FROM $ordered INNER JOIN users ON users.id = m.user_id"; $result = mysqli_query($db, $query) or trigger_error("Query Failed! SQL: $query - Error: ".mysqli_error($db), E_USER_ERROR); $n = mysqli_num_rows($result); for ( $i = 0; $i < $n; $i++){ $posts[$i] = mysqli_fetch_assoc($result); }
内容的提问来源于stack exchange,提问作者Dadinho2000
相关产品推荐
相关产品推荐

