我有以下 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 的新手)
最佳答案
如果合适,您可以在JOIN
的ON
子句中使用占位符。 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/