php - 是否可以在 JOIN 中使用占位符?

标签 php mysql sql join pdo

我有以下 SQL 查询,用于输出论坛帖子以及关系表中帖子的相关数据(发布该帖子的用户、其子级的论坛/线程等)。

我正在使用 PDO 位置占位符(因此是 ?)

SELECT {Lots of select stuff here}
FROM tab_posts tposts
INNER JOIN tab_users tuser ON tuser.id=?
INNER JOIN tab_users tusers ON tposts.user_id=tusers.id
INNER JOIN tab_ranks tranks ON tusers.rank_id=tranks.id
INNER JOIN tab_avatars tavatars ON tusers.avatar_id=tavatars.id
INNER JOIN tab_threads tthreads ON tposts.thread_id=tthreads.id
INNER JOIN tab_forums tforums ON tthreads.forum_id=tforums.id
WHERE tposts.thread_id=? AND tforums.rank_id <= tuser.rank_id

因此,在这个查询中,我使用了 2 个占位符,第一个是从 session 中检索到的用户 ID,另一个是从请求中检索到的线程 ID(以确保我们只列出属于该线程的帖子) )。

tuser 是 session 用户,tusers 是提交帖子的用户的别名。我只要求 tuser 检查是否允许 session 用户查看这些帖子(按访问等级,论坛表中的 rank_id 是允许的最低等级)。

我只是想确认在 JOIN 部分中使用占位符(或者更确切地说,变量)是否有效?或者我仅限于使用表格?我很确定我使用不正确,在这种情况下我还能如何检查用户的排名?

我也不确定我的其他 JOIN 是否实际上有效,呸! (如果你不知道的话,我是使用 JOIN 的新手)

最佳答案

如果合适,您可以JOINON 子句中使用占位符。 ON 条件只需是某个在两个表之间进行行与行比较时计算结果为 TRUE 的表达式,因此类似于

的条件
FROM
  t1
  LEFT JOIN t2 ON t1.id = t2.id AND t2.othercol = ?

将是 ON? 占位符的有效使用。在像上面这样的连接条件中,id 列上的匹配 othercol 列上的匹配 ?输入值必须为 true 才能满足连接要求。当需要多个列匹配来关联表时,您通常会在 LEFT JOIN 中看到这种用法,但添加 WHERE 条件会错误地导致 LEFT JOIN 省略 NULL,因此表现得像 INNER JOIN

但是,就您的情况而言,您似乎实际上只需将该用户条件移至 WHERE 子句中即可将结果集过滤到所请求的用户 ID。

SELECT {Lots of select stuff here}
FROM tab_posts tposts
  INNER JOIN tab_users tusers ON tposts.user_id = tusers.id
  INNER JOIN tab_ranks tranks ON tusers.rank_id = tranks.id
  INNER JOIN tab_avatars tavatars ON tusers.avatar_id = tavatars.id
  INNER JOIN tab_threads tthreads ON tposts.thread_id = tthreads.id
  INNER JOIN tab_forums tforums ON tthreads.forum_id = tforums.id
WHERE 
  /* This condition belongs in the WHERE */
  tusers.id = ?
  tposts.thread_id = ?
  AND tforums.rank_id <= tuser.rank_id

只要您的表实际上按照联接表达的方式进行布局,您的其余联接看起来就是正确的。

为了更概括一点,? 占位符可以用在您本来会在查询中使用标量值的任何地方;即字符串或数值(或 bool 值、blob 等)。因此您可以将它们用作函数参数,例如:

/* Truncate a column to some ? number of characters */
SELECT LEFT(column, ?)

或者 SELECT 列表中的标量值:

/* Add an additional string suffix to every row in a column */
SELECT CONCAT(column, ?)

但是,您不能使用? 代替表名或列名。它们仅适用于标量值。

关于php - 是否可以在 JOIN 中使用占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28227318/

相关文章:

sql - 确定最小连续年份范围的第一年和连续年份计数

MySQL将2个表中的数据合并到第3个表中

php - 从 php 表单获取 cookie 值

mysql - 查询慢,索引哪些字段

php - 使用时间戳从一个表值更新另一表

mysql - 双连接(一个来自同一个表,一个来自不同表)

MySQL删除记录所属组后删除记录

Android Ormlite - 使用条件 where 子句构建查询

php - MYSQL 使用下拉列表和 session 变量插入

php - 寻求帮助修复 php 脚本错误