2010-04-29 4 views
0

나는 웹 사이트 전체에서 사용자의 완전한 활동을 얻으려고합니다.PHP + MySQL에서 많은 테이블을 조건으로 결합하는 방법

하나의 사용자라는 조건으로 데이터베이스 전체에서 여러 테이블을 조인해야합니다.

SELECT * FROM 
comments AS c 
JOIN rphotos AS r 
ON c.userID = r.userID 
AND c.userID = '$defineUserID'; 

그러나 그것은 무엇 반환하는 사용자에 대한 모든이지만, 행을 반복 : 내가 현재 무엇을 쓸

이다.

예를 들어 한 사용자의 경우 6 개의 사진과 5 개의 댓글이 있습니다. 그래서 11 개의 행이 반환 될 것으로 예상됩니다. 내가 뭘 잘못 등

PhotoID = 1; 
CommentID = 1; 
PhotoID = 1; 
CommentID = 2; 
PhotoID = 1; 
CommentID = 3; 

및 ...

:

대신 그렇게 같은 30 개 결과를 반환?

난 당신이 페이스 북 사용자의 경우 (예)

을 달성하기 위해 노력하고있어, 모든 프로파일은 연대순으로 웹 사이트에서 사용자의 활동을 알리는 '벽'이있다. 나는 비슷한 것을 만들려고 노력하고있다. 다음과 같이

+2

우리가 테이블이되는 구조를 알려주십시오 (예. 날짜를 기준으로)를 사용하면 표시되지 않습니다 노조의 행을 많이 가입 방지하기 위해 더 결과를 필터링 할 합류했다. 도움이 될 것입니다. – Kangkan

+0

@ 모에 : 당신은 코멘트와 사진 테이블 사이에 합류 필드 조건을 넣는 것을 잊었습니다. –

+0

은 완전히 반복되는 모든 행입니까? 그렇다면 단지 select와 * – Cesar

답변

1

당신은 그것을 수행해야합니다 다음 어리석은 실수

이것이 않는 것은 (이 경우 1) 사용자 테이블에서 모든 관련 사용자 선택입니다 해결에 가입

SELECT * FROM user AS u 
LEFT JOIN rphotos AS r ON u.userId = r.userID 
LEFT JOIN comments AS c ON u.userId = c.userID 
WHERE u.userId = '$defineUserID' 

업데이트 필요한 경우 다른 테이블은 행을 반복해서는 안됩니다.

논리적으로 생각하면 쿼리가 더 적합합니다.

+0

사이에 distinct를 추가하십시오. 당신의 위치가 틀린 곳에 있지만, MySQL과 같이이 쿼리를 시도해 본 다음에 userID별로 그룹화하기 때문에 하나의 행만 반환하면 놀랄 것입니다. 그건 아마 당신이 뭘 기대하는거야 아니에요 ... – wimvds

+0

고마워 롤, 바보 같은 실수 – Chris

+0

OP는 모든 사용자를 나열하는 것에 대해 결코 물어 보지 않았습니다 - 외부 조인은 비쌉니다. – symcbean

1

내가 뭘 잘못하고 있니?

두 개의 간단한 쿼리를 사용할 수있을 때 하나의 복잡한 쿼리를 사용하고 있습니다.

+0

사실, 어떻게 그룹화하고 연대순으로 주문합니까? 페이스 북의 '벽' – Moe

+0

처럼 PHP를 사용하는 것, 물론 –

+0

어떻게 할 것인가? – Moe

1

특정 사진에 6 장의 사진과 5 장의 댓글이있는 경우 30 개의 결과를 얻을 수 있습니다. 사용자 ID를 기반으로 모든 사진과 댓글의 데카르트 제품을 가져 오기만하면되기 때문에 매우 일반적입니다. 테이블 구조는 가능한 해결에 도움이 되거 수 있지만 의견이 사진에 관련하는 경우 그리고 당신은 모든 사진을 가져 싶은 코멘트 특정 사용자는 같은 것을 사용할 수 있습니다 게시 : 개인적으로

SELECT * FROM rphotos p 
LEFT JOIN comments c on c.photoID = p.photoID 
WHERE p.userID = '$defineUserID' OR c.userID = '$defineUserID'; 

나는 것을 이를 2 개의 쿼리로 분할하고 결과를 별도로 표시하는 것은 나에게 섞여서 이해가 안되기 때문입니다.아이디 필드는

select actionID, relatedID, creationDate from 
(
select 1 as actionID, photoID as relatedID, creationDate from rphotos 
where userID = '$defineUserID' 
union 
select 2 as actionID, commentID as relatedID, creationDate from comments 
where userID = '$defineUserID' 
) actions 
order by creationDate desc; 

등 뭔가를 사용할 수있는 동일한 유형의 경우 주석

에 따라

SELECT * FROM rphotos p 
WHERE p.userID = '$defineUserID'; 

SELECT * FROM comments c 
WHERE c.userID = '$defineUserID'; 

편집을 사용하여 액션 ID 사진의 경우 1, 메모의 경우 2, relatedID 필드를 사용하면 링크 된 데이터를 조회 할 수 있습니다 (필요한 경우 쿼리에서 삭제할 수 있음).

은 BTW 당신은 ​​아마

+0

나는 시간순으로 나열하고 사용자 actives를 표시하고 싶습니다. 가장 최근부터 최하위까지. – Moe

+0

방금이 경우 도움이 될 수있는 답변을 편집했습니다. 공용체에있는 두 개의 쿼리 데이터가 비슷한 한 다른 필드도 추가 할 수 있습니다. – wimvds

+0

"개인적으로 이것을 2 개의 쿼리로 분할하여 결과를 별도로 표시합니다."-하지만 두 개의 쿼리로 나누지는 않습니다. 각 사진 행에 대한 설명 쿼리를 다시 실행해야합니다. 사진 테이블에 실제 이미지 데이터가 없다고 가정하면 (반환 된 데이터 세트의 크기로 인해 이것이 가장 효율적인 접근 방법입니다) 아마도 외부 조인을 사용하여 단일 쿼리를 수행하는 것이 훨씬 효율적입니다. 사진 테이블의 내용을 한 행에서 다음 행으로 변경할 때만 사진 데이터를 출력합니다. – symcbean

관련 문제