2014-04-17 5 views
1

다 대 다 관계가있는 세 개의 MySQL 테이블이 있습니다.다 대다 관계에서 단 하나의 참조로 행 가져 오기

하나의 테이블은 작업을위한 것이고 다른 하나는 사용자를위한 것이고 세 번째는 작업을 사용자에게 할당하는 것입니다 (각 작업은 여러 사용자에게 할당 될 수 있습니다).

users:   tasks:   assigned: 
+----+------+ +----+-------+ +---------+---------+ 
| id | name | | id | title | | task_id | user_id | 
+----+------+ +----+-------+ +---------+---------+ 
| 1 | John | | 1 | One | | 1 | 1 | 
+----+------+ +----+-------+ +---------+---------+ 
| 2 | Mike | | 2 | Two | | 1 | 2 | 
+----+------+ +----+-------+ +---------+---------+ 
            | 2 | 1 | 
            +---------+---------+ 

한 명의 사용자에게만 작업을 할당하려면 어떻게해야합니까?

하나의 특정 사용자에게만 작업을 할당하려면 어떻게합니까?

답변

1

모든 테이블을 함께 가입해야합니다. 존에 할당 된 모든 작업을 표시하려면 다음을 사용

SELECT name,title 
FROM users 
JOIN assigned ON (user_id=users.id) 
JOIN tasks ON (tasks.id=task_id) 
WHERE name="John"; 

사용 GROUP BYHAVING는 하나의 사용자에게 할당 된 모든 작업을 볼 수 있습니다.

SELECT title 
FROM tasks 
JOIN assigned ON (task_id=id) 
GROUP BY id 
HAVING count(*) = 1; 

후자는 어떤 작업이 할당되었는지, 반드시 한 명의 사용자에게만 할당되었는지 만 알 필요는 없습니다. 따라서 users 테이블에 가입 할 필요가 없습니다.

업데이트 :

당신은 혼자가 요한에게 할당 된 작업을 찾으려면 다음을 사용할 수 있습니다

SELECT name,title 
FROM tasks 
    JOIN assigned ON (task_id=tasks.id) 
    JOIN users ON (user_id=users.id) 
GROUP BY tasks.id 
HAVING COUNT(*) = 1 and name="John"; 

이 가능 인해 2 가지 이유 :

  1. MySQL은 비 허용 HAVING 절에 집계 된 참조.
  2. COUNT(*)=1name을 단일 값으로 설정하십시오. 즉, name에 'John'과 'Mike'가 모두있는 상황이 아닙니다.
+0

다른 테이블 (예 : 각 작업에 대한 메모가 들어있는 테이블)이 연결되면 쿼리가 예상대로 작동하지 않습니다. HAVING 조건이 항상 의도 된대로 작동하려면 다음과 같이 정확한 열에서 COUNT를 계산해야합니다. HAVING COUNT (DISTINCT user_id) = 1 and name = "John" ' –

+0

True이면 동일한 사용자가 할당되지 않습니다. 동일한 작업에 여러 번. 의미 론적으로는별로 의미가 없으며 (task_id, user_id)를 'assigned'테이블에서 고유 한 것으로 선언함으로써 피하는 것이 좋습니다. 물론 '사용자'또는 '작업'테이블에서 ID가 고유하지 않은 경우에도 동일한 문제가 발생할 수 있습니다. – vhu

+0

앞에서 언급했듯이 다른 테이블이 조인되고 열이 선택되면 'COUNT (*)'를 방해하기 때문에 실패합니다. 'assigned '에있는 고유하지 않은 사용자 ID와는 아무런 관련이 없습니다. 물론 사용자의 의견이있는 테이블과 같이 고유하지 않은 사용자 ID가있을 수 있습니다. –

관련 문제