나는 다음과 같은 SQL 쿼리를 사용하여 관계형 테이블의 관련 데이터 (게시물을 올린 사용자, 포럼/스레드의 자식 등)와 함께 포럼 게시물을 출력하는 데 사용됩니다. 내가 PDO 위치 자리 표시자를 사용하고JOIN에서 자리 표시자를 사용할 수 있습니까?
(따라서?의) 그래서 내가이 자리 표시자를 사용하고이 쿼리에
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
은, 첫 번째는 다른 하나는 세션에서 검색 한 사용자의 ID입니다 요청에서 검색된 스레드 ID (해당 스레드에 속한 게시물 만 나열하도록)
tuser
은 세션 사용자이고 tusers
은 게시물을 제출 한 사용자의 별칭입니다. 세션 사용자가 해당 게시물을 볼 수 있는지 확인하려면 tuser
만 필요합니다 (액세스 순위에 따라 포럼 테이블의 rank_id
이 허용되는 최소 순위 임).
JOIN 섹션의 자리 표시 자 (또는 오히려 모든 변수)가 유효한지 여부를 확인하고 싶습니다. 아니면 테이블을 사용하는 것으로 제한됩니까? 나는 그것을 틀리게 사용하고 있다고 확신한다. 그렇다면 어떻게하면 사용자 순위를 확인할 수 있을까?
내 다른 JOIN이 실제로 유효한지 확실하지 않습니다. bah!
WHERE 구성 요소에'tuser.id =? '를 그냥 추가하지 않는 이유는 무엇입니까? 그렇다면 INNER JOIN에게 과세하는 것을 피할 수 있습니다. – Scopey
자리 표시자는 ** 값 **을 나타내는 모든 것에 사용됩니다. 즉, 네가 두 개의 정수를 전달하기 때문에 사용했던 것처럼 사용할 수 있습니다. 테이블 이름이나 열 이름에는 사용할 수 없습니다. 생각해 보면 자리 표시자가 나타내는 것은 숫자가 모두 끝나고 실행 준비가 끝난 후 문자열입니다. –
조인은 조회 결과를 제한하지 않고 다른 테이블의 열을 선택하기위한 조인입니다. 쿼리의 결과를 더 작은 하위 집합으로 제한하려는 경우 where 절에 속합니다. 선택할 수없는 값에 대해 다른 테이블을 검사해야하는 경우 하위 쿼리를 사용하십시오. –