2011-11-11 6 views
1

좋아요, 여러 개의 테이블에서 데이터를 가져와야합니다. 모든 테이블에는 키가 있습니다.MYSQL Join Statement - im lost

프로젝트 : (키 : PROJECT_ID, USER_ID) (키 ID) Projects_users (키 ID) 사용자

기본적으로 각 프로젝트는에 N 사용자를 가질 수 있습니다. 각 프로젝트에있는 모든 사용자를 형식화 된 응답으로 가져와야합니다. 예를 들어

: 또한

projects = {[ 

    1: { 
      'title':'Project 1', 
      'users': [ 
       1: { id: 23, name:'john' }, 
       2: { id: 55, name:'sally' } 
      ] 
    } 

    2: { 
      'title':'Project 2', 
      'users': [ 
       1: { id: 41, name:'jeff' }, 
       2: { id: 55, name:'sally' } 
      ] 
    } 

]} 

, 난 여러 MYSQL 문으로 PHP에서이 작업을 수행 할 수 있습니다 이해합니다. 그게 더 빠를거야 및 PHP에서 연결을 수행하거나, MYSQL이 더 효율적/신속하게 할 수 있습니다.

답변

0

: 그 후

SELECT `Projects`.*, `Users`.* FROM 
    `Projects` JOIN (
     `Projects_users` JOIN 
      `Users` 
      ON `Projects_users`.`user_id` = `Users`.`id` 
     ) 
     ON `Projects`.`id` = `Projects_users`.`project_id` 
    ORDER BY `Projects`.`id` 

을, 단일 패스로 결과 테이블을 탐색하고 원하는 배열을 빌드 할 수 있습니다.

+0

감사합니다. 하지만 2 개의 별도 호출을 수행하는 PHP 함수를 수행하는 것이 더 낫습니까? –

+0

여러 쿼리를 보내는 것과는 대조적으로 하나의 큰 쿼리를 더 잘 최적화 할 수 있으므로 가능한 한 많은 계산을 MySQL 서버에 오프로드하는 것이 더 효율적이라고 생각합니다. (하지만 나는 그것에 대해 잘못 될 수있다) – Erbureth

+0

달콤한, 고마워! 나는 동료로부터 같은 반응을 얻었다. 또한 (마지막 질문) 어떻게하면 다른 행을 덮어 쓰는 중 일부가 {TABLE}. {ROW} 인 것처럼 데이터를 다시 가져올 수 있습니다. 다시 한 번 감사드립니다! –

0

나는이 시도하지 않은,하지만 당신이 찾고있는 무슨에 가까워 야 :

select p.title, u.name 
from projects p inner join users u 
    on p.id = u.id 
order by p.title 

당신은 "가입"데이터를 얻을 수 ..하지만 형식을 PHP를 사용합니다.

PS : "프로젝트"하나 개의 테이블 인, "사용자"번째 테이블 ... 및 "프로젝트"테이블은 사용자 ID는 "외래 키"를 길게 할 필요가 23, 55, 41

+1

프로젝트 : 사용자 관계가 m : n이고 코드가 가정 할 때 1 : n이 아니기 때문에 이것이 충분하지 않다고 생각합니다. – Erbureth

+0

맞습니다. 프로젝트 (프로젝트 ID 및 제목), 사용자 (사용자 ID 및 이름 포함) ... 및 "프로젝트 멤버쉽"("사용자"및 "프로젝트"간의 m : n 관계 매핑) 테이블이 실제로 3 개 필요합니다. . – paulsm4

0

MySql은 원하는 것처럼 트리 구조로 데이터를 반환 할 수 없습니다. 두 가지 방법으로이 작업을 수행 할 수 있습니다

  1. 는 하나 개의 데이터 세트의 모든 프로젝트와 두 번째 데이터 세트에 해당 프로젝트에 관련된 모든 사용자를 가져옵니다. 필요한 JSON 객체를 생성하는 코드를 작성해야합니다.

  2. 프로젝트 테이블의 내부 조인을 수행하는 데이터 세트를 사용자 테이블과 함께 사용하면됩니다. 많은 컬럼에 대해 반복적 인 정보를 얻지 만, 모든 SQL 문을 얻을 수 있습니다. 그런 다음 결과 세트를 반복하고 필요한 구조를 생성 할 수 있습니다.

당신은 내부 조인 도움이 필요하면 뭔가처럼, 그것은 것입니다 : 당신은 원하는 데이터를 얻기 위해 다음과 같은 문장을 사용할 수 있습니다

select p.title, u.id, u.name 
from projects p 
inner join project_users pu on pu.project_id=p.id 
inner join users u on u.id=pu.user_id