2011-07-01 5 views
0

나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 나는 MySQL보기를 만들었고 4 개의 다른 표에서 일부 데이터를 가져 왔지만 첫 번째 기록 만 반환하는 것으로 보입니다.SQL보기 만 첫 번째 레코드를 반환합니다.

CREATE OR REPLACE VIEW request_view AS 
    SELECT 
    TRequest.id, 
    TRequest.minutes_required, 
    TRequest.expires_at, 
    User.name AS author, 
    TRequest.abstract_text, 
    TRequest.full_text, 
    TGroup.name AS tgroup, 
    SUM(TOrder.minutes) AS total_minutes 
    FROM 
    TRequest 

    JOIN User ON TRequest.author_id = User.id 
    LEFT JOIN TGroup ON TRequest.group_id = TGroup.id 
    LEFT JOIN TOrder ON TRequest.id = TOrder.request_id 

    ORDER BY TRequest.created_at; 

나는이보기에 대해 선택할 때 그것은 단지 첫 번째 레코드 반환합니다

mysql> select id from request_view; 
+----+ 
| id | 
+----+ 
| 1 | 
+----+ 
1 row in set (0.00 sec) 

mysql> select id from request_view where id=2; 
Empty set (0.00 sec) 

내가 ... 내가보기를 모두 돌려받을 수 어쨌든이 30 개 TRequest 행이를 TRequest 기록? 아니면 단순히보기를 잘못 사용하고 있습니까?

+0

TRequest, TGroup 및 TOrder에도 해당 레코드가 몇 행 있습니까? 나는 하나를 걸 겠어. 질문에 모든 표의 내용을 포함시킬 수 있습니까? – JohnFx

답변

1

당신은없이 SUM을하고있는 : 당신이로 교체하면 어떻게됩니까

JOIN User ON TRequest.author_id = User.id 

GROUP BY. SUM은 행 그룹에 대해서만 의미가있는 집계 함수입니다. 그룹화 할 열을 지정하지 않으면 기본값은 모든 행에 대해 합계를 취하므로 하나의 결과 만 얻습니다.

각 열에 대해 한 행을 TRequest에 표시하려면 GROUP BY TRequest.id을보기 정의에 추가하십시오.

+0

그게 바로 그거야. 이것은 stackoverflow.com을 사용하는 나의 처음이었고 이것은 놀랍습니다. 답변 해 주셔서 감사합니다. – Ben

+0

문제는 없습니다. @ 벤! 행복한 개발 :) –

+0

+1 Well spotted – Andomar

0

기본 joininner join이기 때문에이 라인은 실제로 행을 필터링 할 수 있습니다 :

LEFT JOIN User ON TRequest.author_id = User.id 
관련 문제