2013-08-31 2 views
3

이전에이 질문을 받았지만 이해하는데 어려움이 있습니다. 나는 거의 원시 SQL을 사용하지 않는다.
나는 세 개의 테이블 - Session, GroupNameGroupSessionFeedback을 가지고 있습니다.내부 조인트가있는 데카르트 제품 피하기

나는 idUserGroupFeedbackSession에 합류 그리고 난 idGroupSessionGroupName에 합류하고있다. 나는 그것이 idSessions 다시 독특한 가지고 싶어

SELECT s.idSession, 
     g.name, 
     s.Assistant, 
     s.idGroup, 
     s.start, 
     s.end, 
     f.value 
    FROM rempad.Session s 
INNER JOIN rempad.GroupSessionFeedback f 
    ON s.idUser = f.idUser 
INNER JOIN rempad.GroupName g 
    ON s.idGroup = g.idGroup 
WHERE s.start BETWEEN '2013-04-28' AND '2013-05-28' 
    AND s.idUser = 22 
    OR s.idUser = 23 
    OR s.idUser = 24 
    OR s.idUser = 26 
    OR s.idUser = 27 
    OR s.idUser = 28 
    OR s.idUser = 42; 

하지만 조인 나는 정말로 아이디어가의 어떤 다른 접근을 할 수 있기 때문에 그것을 여러 번 일치한다 :

여기 내 SQL 코드입니다. 나는 데이터베이스에 별도의 호출을 할 수있다. 그러나 나는 데이터베이스를 망치는 것을 피하려고 애 쓰고있다.

아이디어가 있으십니까?

+0

두 점 : 당신은'ands'와'ors' 혼합된다. 'And'는'or'보다 우선권을 가지므로'start' 필터는 iduser 22에만 적용됩니다. 다른 사용자는 단순히 결과에 추가됩니다. [MySQL 또는/및 우선 순위?] (http://stackoverflow.com/questions/12345569/mysql-or-and-precedence)를 참조하십시오. 'in '을 사용하거나 모든 ors를 괄호로 묶으십시오. 두 번째 포인트 : 성능이 향상되지 않으면 색인을 다시 방문해야 할 것입니다. –

답변

0

에 한번이를 사용하여 사전에

감사 :이 그것을 해결 희망

select {.......} 
from session s inner join groupsessionfeedback f inner join groupname g 
on s.iduser = f.iduser and s.idgroup = g.idgroup 
where {.......} 

. 그러나이 쿼리에 다른 필터가 필요한 경우 알려주십시오.

+0

안녕하세요, 귀하의 답변 주셔서 감사합니다,하지만 귀하의 솔루션은 여전히 ​​같은 결과를 생산 믿습니다. 다른 구문으로 작성된 두 개의 내부 결합이지만 근본적으로 여전히 테이블의 데카르트 곱을 생성합니다. 이것이 내가 피하고자하는 바입니다. 하지만 답장을 보내 주셔서 감사합니다. –

2

이 페이지의 예 : SQL query returning cartesian product을 사용하여 알아 냈습니다. 공정성에서 나는 내 질문에 데이터베이스 구조를 제공하지 않았다. 그러나 문제는 내가 참여한 각 테이블에 일치하는 열이 하나 이상 있으므로 조인 통계에이를 반영해야한다는 것이 었습니다. 여기에 샘플이 있습니다

INNER JOIN rempad.GroupSessionFeedback f 
ON s.idUser = f.idUser 
AND s.idSession = f.idSession 
AND s.idGroup = f.idGroup 

다른 사람들에게 도움이되기를 바랍니다. L

0

쿼리의이 버전이 같은 문제가 고통을합니까 : 여전히 중복 된 결과를 생성하는 경우

SELECT s.idSession, g.name, s.Assistant, s.idGroup, s.start, s.end, f.value 
    FROM rempad.Session s 
INNER JOIN rempad.GroupSessionFeedback f 
    ON s.idUser = f.idUser 
INNER JOIN rempad.GroupName g 
    ON s.idGroup = g.idGroup 
WHERE s.start BETWEEN '2013-04-28' AND '2013-05-28' 
    AND s.idUser in (22, 23, 24, 26, 27, 28, 42); 

을 다음 당신은 무엇을 행이되고 싶어합니까? 결국,이 여러 idsession의 문제를 해결할 것이다, 그러나 g.name 또는 f.value 반환하지 않습니다

SELECT distinct s.idSession, s.Assistant, s.idGroup, s.start, s.end 
    FROM rempad.Session s 
INNER JOIN rempad.GroupSessionFeedback f 
    ON s.idUser = f.idUser 
INNER JOIN rempad.GroupName g 
    ON s.idGroup = g.idGroup 
WHERE s.start BETWEEN '2013-04-28' AND '2013-05-28' 
    AND s.idUser in (22, 23, 24, 26, 27, 28, 42); 
관련 문제