2017-03-23 1 views
0

다음 데이터베이스 테이블이 있습니다.선택 방법 MySQL에서 유형 당 최소 2 개의 1 : n 관련 레코드

my_left_table 
left_id  name 
1   A 
2   B 
3   C 

my_right_tabe 
right_id thing  left_id_fk status 
1   D   1   new 
2   E   1   new 
3   F   2   old 
4   G   3   old 
5   H   3   new 
6   I   3   new 
7   J   1   old 
8   K   2   old 
9   L   2   new 
10   M   3   old 
11   N   3   old 
12   O   1   new 

원하는 결과는 다음과 같습니다.

my_left_table 
left_id  name 
3   C 

어떻게 권리 기록 AT LEAST 2 statusnew이다하고 2 statusold입니다 왼쪽 레코드를 선택 않습니다. 예를 들어, left_id 1은 대상이 아니며, 오른쪽 레코드 중 3 개가 상태가 new이지만 하나의 레코드 만 이전 상태입니다.

지금까지 나는 있습니다.

SELECT *, COUNT(my_right_tabe.left_id_fk) AS count_left_id_fk 
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk 

답변

2

은 먼저 값을 그룹화하여 원하는 결과를 달성하고 총을 확인할 수있는 다음과 같은

SELECT my_left_table.left_id, my_left_table.name 
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.left_id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk 
HAVING SUM(my_right_tabe.status="new") >= 2 AND 
     SUM(my_right_tabe.status="old") >= 2 
+0

내가 얘기를 깜빡 했네요 한가지 더있다이다. 상태는 새롭고 오래되었지만 동적 인 것 이상입니다. 그 상태 값이 무엇인지 말할 수 없습니다. 어떻게 해결할 수 있을까요? –

+0

그러면 사미어가 다른 답변에서 쓴 내용을 살펴보아야합니다. 그러나 완전히 동적 인 것이 원하면 having 절을 다음과 같이 변경해야합니다. HAVING SUM (status_calc) = (SELECT COUNT (DISTINCT (status)) FROM my_right_tabe); – user1898027

1

처럼 MySQL의 에 HAVING 절을 사용합니다. 2보다 크면 해당 레코드를 가져옵니다.

다음은 쿼리

SELECT z.* 
FROM 
(
    SELECT a.left_id, name, status, IF(COUNT(*) >=2, 1, 0) AS status_calc 
    FROM my_left_table a JOIN my_right_table b 
    ON a.left_id = b.left_id_fk 
    GROUP BY left_id, status 
) z 
GROUP BY z.left_id 
HAVING SUM(status_calc) = 2; 

Working Demo

관련 문제