2011-09-23 3 views
1

3 개의 테이블을 사용하여 최종 결과를 얻습니다. 그들은 project_board_members, usersproject_team이라고합니다. 그냥 내가 사용하고 프로젝트를 가리키는 때문에다른 테이블을 결합한 후 예기치 않은 결과가 발생했습니다.

SELECT `project_board_members`.`member_id`, 
     `users`.`name`, 
     `users`.`surname`, 
     `users`.`country`, 
     `project_team`.`tasks_completed` 
FROM `project_board_members` 
JOIN `users` 
    ON (`users`.`id` = `project_board_members`.`member_id`) 
JOIN `project_team` 
    ON (`project_team`.`user_id` = `project_board_members`.`member_id`) 
WHERE `project_board_members`.`project_id` = '5' 

당신은 마지막 줄을 무시할 수 있습니다 :

은 쿼리입니다.

project_board_members 세 가지 항목을 보유하고있는 구조와 같은

  • id,
  • member_id,
  • project_id,
  • created_at;

나는이 테이블에서 member_id을 얻어야합니다. 그렇다면 name, surnamecountry을 얻으려면 users 테이블에 가입하십시오. 아무 문제 없습니다. 모든 작품! :)

그 후 각 사용자에 대해 tasks_completed을 얻어야했습니다. 그것은 project_team 테이블에 저장됩니다. 커다란 예기치 않은 일은 네 개의 엔트리가 리턴되었고 큰 what-the-f * ck는 project_board_members 테이블의 엔트리가 세 개 뿐이라는 것입니다.

왜 그렇습니까? 덕분에 조언을!

답변

1

SQL 조인은 조인 조건과 일치하는 왼쪽 W 오른쪽 테이블의 각 조합에 대해 하나의 행을 포함하는 결과 세트를 작성합니다. 데이터 또는 조금 더 많은 정보가 없으면 예상 한 것과 정확히 무엇이 틀렸는 지 말하기 어렵지만 다음과 같을 것입니다.

1) 동일한 user_id를 가진 project_team에 두 개의 항목이 있습니다.

2) project_team의 입력 내용은 user_id와 project_id를 모두 저장하므로 user_id가 아닌 두 항목 모두에 참여해야합니다. 디버깅 목적을 위해

+0

감사합니다. 나는 또한'project_id'를 사용하여 참여할 필요가있었습니다. – daGrevis

0

SELECT GROUP_CONCAT(pbm.member_id) AS member_ids, 
     GROUP_CONCAT(u.name) as names, 
     GROUP_CONCAT(u.surname) as surnames, 
     GROUP_CONCAT(u.country) as countries, 
     GROUP_CONCAT(pt.tasks_completed) as tasks 
FROM project_board_members pbm 
JOIN users u 
    ON (u.id = pbm.member_id) 
JOIN project_team pt 
    ON (pt.user_id = pbm.member_id) 
WHERE pbm.project_id = '5' 
GROUP BY pbm.member_id 

결과에서 여러 항목을 나열 모든 분야

이 결과 집합의 행 개수를 엉망으로하고 있습니다 않습니다.

은 당신이 할 수있는 것을 수정하려면 :

SELECT pbm.member_id 
     u.name, 
     u.surname, 
     u.country, 
     pt.tasks_completed 
FROM (SELECT 
     p.project_id, p.member_id 
     FROM project_board_members p 
     WHERE p.project_id = '5' 
     LIMIT 1 
    ) AS pbm 
JOIN users u 
    ON (u.id = pbm.member_id) 
JOIN project_team pt 
    ON (pt.user_id = pbm.member_id) 
1

project_board_members는 "연관 엔티티"개체 - 관계 모델링 세계라는 것을 나타냅니다. 그것은 다 - 대 - 다 관계를 구현하는 것입니다 (이 경우 프로젝트와 사용자 엔티티 사이에 있음). 종속적 인 엔티티입니다. 즉, 인스턴스의 존재가 존재를 전제로한다는 것입니다 (사용자 및 프로젝트)

결과적으로 해당 엔터티 (member_idproject_id)와 관련된 외래 키를 구성하는 열은 다음 중 일부 또는 모두를 구성해야합니다. 기본 키.

일반적으로 연관 엔티티의 인스턴스는 관련 엔티티를 고유하게 WRT합니다. 귀하의 경우 관계 정의는 다음과 같습니다 :

  • 각 사용자는 0 - 다수 프로젝트의 보드에 앉습니다.
  • 각 프로젝트의 보드는 특정 사용자가 한 번 이상 특정 프로젝트의 이사하지 않을 수 있다는 말을하는 것입니다 0 - 투 - 많은 사용자

으로 구성된다. 다른 열 (예 : id 열)을 기본 키에 추가하는 유일한 이유는 사용자 : 프로젝트 관계가 고유하지 않은 경우입니다.

이 규칙을 적용하기 - 사용자가 한 번만 보드에 특정 프로젝트 앉아 수 - 테이블 스키마는 다음과 같이한다 :

create table project_board_member 
(
    member_id int not null foreign key references user (user_id) , 
    project_Id int not null foreign key references project (project_id) , 
    created_at ... 

    ... 

    primary key (member_id , project_id) , 
) 
} 

id 열이 불필요하다.

관련 문제