2017-10-13 1 views
1

일반 SQL과 다른 동작 :각 질문에 관련된 나는 질문의 테이블과 답변 (결과)의 테이블이 심포니 응용 프로그램이

id | answer_text | question_id | user_id 
---------------------------------------- 
1 | John  | 1   | 10 
2 | Peter  | 1   | 11 
3 | 24   | 2   | 10 

사용자는 질문을 건너 뛸 수 있으므로 답변 테이블의 해당 질문에 대해 일치하는 대답이 아닐 수도 있습니다. 그러나 주어진 사용자에 대한 결과를 검색 할 때 모든 질문과 관련 응답 또는 null이 포함 된 포괄적 인 목록이 필요합니다.

SELECT question_text, answer_text FROM `question` left join result on question.id = result.question_id and user_id=10 

저를 가져옵니다 :

question_text | answer_text 
---------------------------------------- 
Name?   | Peter 
Age?   | null 

내가 기대 그냥 일 : USER_ID (11)에 대한

question_text | answer_text 
---------------------------------------- 
Name?   | John 
Age?   | 24 

,이처럼 보이는 그래서 (일반 SQL에서) 나는이 같은 가입 떠났다.

이 쿼리를 dql 쿼리로 변환하려고하면 문제가 발생합니다. 이런 일을하고있는 임 :

$qb->select('q.question_title, r.answer_text'); 
    $qb->from('AppBundle:Question', 'q'); 
    $qb->leftJoin(
     'AppBundle:Result', 
     'r', 
     \Doctrine\ORM\Query\Expr\Join::WITH, 
     'q.id = r.question' 
    ); 
    $qb->where('r.user = '.$user->getId()); 

    $answer= $qb->getQuery()->getResult(); 

조인의 오른쪽에 일치하는 데이터가있는 데이터 세트의 경우 제대로 작동합니다. 그러나 오른쪽이 null이면 반환 된 배열에서 getResult가 제거됩니다. 위의 첫 번째 예제는 일반 SQL에서 덤프됩니다.

array:2 [ 
    0 => array:2 [ 
     "question_title" => Name? 
     "answer_text" => "John" 
    ] 
    1 => array:2 [ 
     "question_title" => Age? 
     "answer_text" => "24" 
    ] 
] 

그리고 두 번째 예제의 덤프입니다. 이 일치하는 대답은없고, 내가 한 요소에 불과 배열을 얻을 :

array:2 [ 
    0 => array:2 [ 
     "question_title" => Name? 
     "answer_text" => "Peter" 
    ] 
] 

내가 일반 SQL에 참여 왼쪽으로 얻을 정확한 동작을 모방 할 수있는 방법이 있다면 나도 몰라합니다.

메신저 데이터베이스 엔진이 mysql을 사용하는 방식에 차이가 나는 경우를 대비하여.

EDIT : 실제로 묻는 질문이 없습니다 Doctrine2 LEFT JOIN with 2 conditions. DQL과 SQL에서 동일한 쿼리가 다르게 동작한다고 생각했습니다. 내가 번역을 망쳤다는 것이 드러났다.

+1

가능한 복제 [Doctrine2 LEFT 가입 수행하는 것보다 당신의 엔티티에 정의 된 매핑을 가지고 2 가지 조건으로 JOIN] (https://stackoverflow.com/questions/15815869/doctrine2-left-join-with-2-conditions) 이것은 분명히 기본적입니다. 당신은 무엇을 찾았습니까? ? – philipxy

+0

그건 내가 묻고있는 것이 아니 었습니다. DQL에서 다르게 동작하는 SQL의 쿼리가 있다고 생각했지만 실제로 아래 번역 된 사용자가 잘못 번역했습니다. –

+0

그 질문에 (* (가난한) 제목에도 불구하고) * 묻는 질문은 결과가 어떤 'join'과 'where'에 주어진 특정 방식으로 잘못된 이유입니다. 따라서 질문의 합리적인 특성화는 당신의 상황을 포함합니다. 그 질문에서 * 대답하는 것은 asker가'on '에 그것을 필요로 할 때'where'에 잘못 조건을 넣는 것입니다. 그것이 귀하의 질문에 대한 답변입니다. 또한 다른 많은 히트작들과 유사하며 히트 곡도 있습니다. 나는 * 내가 찾은 * Google이 준 응답. 그래서 ... – philipxy

답변

1

당신은 DQL 당신이 결합 된 결과 세트에 WHERE 조항을 적용하려고하는 쿼리를 참조하므로 필터가 올바르게 작동하고 당신은 당신의 SQL 쿼리를 보면 사용자 ID는 이제 11

없는 경우에는 결과를 필터링하는 경우 당신은 WHERE 절을 사용하고 있지 않습니다. 질문 ID와 사용자가 결과 테이블을 조인하려고하면 11이 나오므로 사용자 ID가 11 인 결과 테이블의 행을 조인하고 일치하지 않는 행에 대해서는 null을 생성합니다.

(단계 가입 수행 한 후) ON 클로스와 WHERE, WHERE이 결합 된 결과 집합을인가하면서 ON 절에 필터가 결합 한번에 작동에 필터를 갖는 차이가있다.

그것이

SELECT q.question_title, r.answer_text 
FROM AppBundle:Question q 
LEFT JOIN AppBundle:Result r 
    WITH q.id = r.question AND r.user = :user 

로 기록 될 수 있습니다 SQL에 DQL 동등한를 작성하려면 그것의 더 나은 오히려 수동 Association Mapping

+0

네, 분명했습니다. 나는 원래 SQL에 필터가 있다고 생각했습니다. 결론 : 내 잘못. 감사. –

관련 문제