2013-07-07 1 views
0

현재 로그인 한 사용자의 $userid은 모두 현재 PHP 코드에서 사용할 수 있습니다. mysql 테이블에 대해 쿼리를 실행하여 자신과 친구의 상태 업데이트를 모두 createddate DESC으로 반환하도록하고 싶습니다.하나의 쿼리 결과를 기반으로 MySQL 쿼리를 여러 테이블에 단일 쿼리로 결합 할 수 있습니까?

MySQL의 샘플 데이터베이스 테이블 :

[statusupdates]

statusupdateid int(8) 
ownerid int(8) 
message varchar(250) 
createddate datetime 

[친구]

friendid int(8) 
requestfrom int(8) 
requestto int(8) 
daterequested datetime 
dateupdated datetime 
status varchar(1) 

질문 : 주문시 각 statusupdates.useridstatusupdates.message를 반환하는 단일 문자열 쿼리를 수행 할 수 에 의해 statusupdates.createddate DESC?

또는 정렬 모든 후, 나는 $useridfriends.requestfrom 또는 friends.requestto 다음, ($userid을 포함하지 않는 한) 다른 friends.requestfrom 또는 friends.requestto에 대한 또 다른 쿼리를 실행 중 하나로 각 friends 레코드에 대한 쿼리를 실행해야합니까 결과 중 statusupdate.createddate을 입력 한 다음 statusupdates.message을 얻으시겠습니까?

+2

구글'SQL JOIN' – mishik

답변

1

당신은 MySQL 조인을보고 싶습니다.

나는 이것이 여러분이하는 것과 비슷한 것을 할 수 있다고 생각하지만, 디버깅이 거의 필요합니다!

SELECT DISTINCT s.ownerid, s.message 
FROM statusupdates s 
LEFT JOIN friends f ON ($userid = f.requestfrom) 
LEFT JOIN friends f ON ($userid = f.requestto) 
ORDER BY s.createddate; 
+0

나는 검색하고 페이지 http://www.w3schools.com/sql/sql_join.asp 나는 기본적으로 2 열을 연결할 수 있다는 것을 이해하고 알 수 있도록 발견 2 개의 테이블을 가지고 있지만 "fri"의 2 개 열을 사용하는 방법을 잘 모르겠습니다. "잠재적으로 일치하는"statusupdates.ownerid "테이블 – SystemX17

+0

죄송합니다. statusupdates 테이블과 ownerid를 참조하려고했습니다. (하지만 우연히 userid를 썼습니다.) – SystemX17

+0

나는 함께 무엇인가 고정시킬 것입니다. :) – Chris

1

테스트되지 않았지만 적어도 올바른 방향으로 작동해야합니다.

하위 쿼리에서 userid의 목록을 얻을 수있는 IN()을 사용할 수 있습니다. 그 하위 쿼리는 requestfromuserid을 얻기 위해 2 번째 쿼리에 UNION을, 두 번째로 requesttouserids으로 두 번째 쿼리를 만듭니다. 마지막으로 우리는 또한 현재 userid.

을 포함하는 OR를 추가, 당신이 우정

에게
SELECT s.ownerid, s.message 
FROM statusupdates s 
WHERE s.ownerid IN (
        SELECT f1.requestfrom 
        FROM friends f1 
        WHERE f1.requestto = $userid 
        AND f1.status = 1 

        UNION 

        SELECT f2.requestto 
        FROM friends f2 
        WHERE f2.requestfrom = $userid 
        AND f2.status = 1 
        ) 
OR s.ownerid = $userid 
ORDER BY s.createddate DESC 

테이크를 확인하지 않은 사람들에서 업데이트를하지 않는 한, 당신은 또한 어디에 status = 1를 필터링 할 가정 이 sqlFiddle 예를 한 번 봐 - http://sqlfiddle.com/#!2/85ea0/3

+0

나는'status = 1' 친구와 sqlFiddle 예제 만 필터링하도록 내 대답을 편집했습니다. – Sean

+0

이것은 테스트 후에도 작동합니다. 두 응답이 올바르게 작동하는 것처럼 2 개의 응답을 표시 할 수 있었으면 좋지만 다른 방법을 사용하십시오. 시간 내 주셔서 감사합니다. 대단히 감사합니다. – SystemX17

관련 문제