2013-09-26 3 views
1

MySQL과 관련하여 도움이 필요합니다.SQL 쿼리 : 다른 테이블을 추가해도 결과가 변경되는 이유는 무엇입니까?

Q1 :

select cn.idConteudo, TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) 
from navegacaolog nl, conteudoNo cn     
where nl.idConteudoNo = cn.idConteudoNo AND 
TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 

결과는 다음과 같다 :

enter image description here

을하지만 난에 "에서"다른 테이블을 추가하는 경우가 있습니다 내가이 쿼리 Q1이 있다고 가정하자 말 : utilizador 테이블 (Q2), 결과는 다음 그림과 같이 매우 다릅니다.

enter image description here

Q2 :

select cn.idConteudo, TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) 
from navegacaolog nl, conteudoNo cn,  utilizador     
where nl.idConteudoNo = cn.idConteudoNo AND 
TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 

내가 이해하지 못하는 이유는 너무 많은 중요성을 가지고 (절 곳에서 사용하지 않고) 다른 테이블을 추가하는 사실. 누군가 제발 좀 도와 줄 수 있어요?

종류는 각각의 결과가 새로운 테이블의 행과 동일한 횟수 반복 된 단지,

+0

이 anoter 테이블이 같은 필드가 않습니다 안부? 어쩌면 당신은 Join으로 그들을 결합하려고 할 수 있습니다, 나는 이것이 명확한 질문이 아니라고 생각합니다. –

답변

4

조인 조건을 지정하지 않았으므로 기본 테이블의 가능한 모든 행 조합에 대해 행을 생성하는 FULL CROSS JOIN이 표시됩니다.

http://en.wikipedia.org/wiki/Join_(SQL)

나는 대한이 조인 ANSI 구문을 사용하여이 혼란을 피할 것을 찾을 수 있습니다. 쉼표를 FROM 절에 사용하지 마십시오 ... 실제 JOIN 절을 사용하십시오 ...

select cn.idConteudo, TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) 
from navegacaolog nl 
JOIN conteudoNo cn ON nl.idConteudoNo = cn.idConteudoNo 
where TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 
+0

그리고 다른 테이블을 추가하고 싶다면? 원래 쿼리는 다음과 같습니다 : ' select cn.idConteudo, SUM (uta.pontuacao), \t \t SUM navegacaolog NL, conteudoNo CN, utilizadortesteavaliacao의 UTA ' \t nl.idConteudoNo = cn.idConteudoNo AND \t \t TIMESTAMPDIFF (SECOND, NL 행 (TIMESTAMPDIFF (SECOND, nl.dataInicio, nl.dataFim)) .dataInicio, nl.dataFim)> 120 AND \t \t uta.idUtilizador = nl.idUtilizador' –

+1

그런 다음 다른 조인 절과 조건을 추가합니다. 원하는만큼의 JOIN을 가질 수 있습니다. – Jasmine

+0

그래서,이 같은 일이 :'nl.idConteudoNo = cn.idConteudoNo ON conteudoNo CN 가입 NL ON utilizadortesteavaliacao의 UTA 가입 navegacaolog NL 에서 (SECOND TIMESTAMPDIFF (nl.dataInicio, nl.dataFim)) cn.idConteudo, 합계 을 선택 .idUtilizador = uta.idUtilizador TIMESTAMPDIFF (SECOND, nl.dataInicio, nl.dataFim)> 120 group by cn.idConteudo' 맞습니까? 불행히도 여전히 작동하지 않습니다, 나는 타임 스탬프의 SUM이 너무 높은 값을 생성해서는 안된다고 생각합니다. –

1

결과가 변경되지 않은 간주한다. 이유는 where 절에 조인을하지 않고 새 테이블을 추가했기 때문에 교차 조인이 있기 때문입니다.

+0

Hum, ok, 나는 그것을 얻었습니다. 그래서 당신은 저도 같은 결과를 얻으려면 그들 사이에 관계를 만들어야한다고 말하고 있습니다. 쓰다? –

+0

예, 관계가 없으면 표를 추가하지 않습니다. navegacaolog NL에서 \t \t SUM (TIMESTAMPDIFF (SECOND, nl.dataInicio, nl.dataFim)) 을' cn.idConteudo, SUM (uta.pontuacao)를 선택 : – Lokesh

1

이것은 ansi가 아닌 SQL 조인 구문을 사용하여 데카르트 제품을 캐스팅하는 것을 인식하지 못하기 때문입니다.

이전에 n 개의 결과가있는 경우 x 레코드의 새 테이블이 논리적으로 n * x 개의 전체 결과를 제공한다는 것을 추가하십시오.

를 사용하여 ANSI 구문이 더 나은 쿼리를 (예를 들어, https://stackoverflow.com/a/11180050/1291428뿐만 아니라 일반적인 실수를 보려면)

SELECT cn.idConteudom SUM(uta.pontuacao), SUM(TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim)) 
FROM navegacaolog nl 
    JOIN conteudoNo cn ON nl.idConteudoNo = cn.idConteudoNo AND 
TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 
    JOIN utilizador uta ON uta.idUtilizador = nl.idUtilizador 
GROUP BY cn.idConteudo 

검색어, 정규화 이해합니다. 조인 조건없이 테이블 (utilizador)을 결합하면 CROSS JOIN을 실현하거나 더 나은 데카르트 제품이라고 할 수 있습니다.

+0

그럼, 내가 원하는 것은 이런 일을하는 것입니다 , conteudoNo CN, utilizadortesteavaliacao의 UTA 여기서 \t는 nl.idConteudoNo = cn.idConteudoNo AND \t \t TIMESTAMPDIFF (SECOND, nl.dataInicio, nl.dataFim)> 120 \t \t uta.idUtilizador = nl.idUtilizador 그룹에 의해 cn.idConteudo ' 내가 조인을 사용하려고 시도하고 있지만, 지금까지 내가 가진 가까운 곳은 재스민 대답입니다. 위에 쓴 것을하기 위해 지금 그것을 적용하고 싶습니다. 내가 어떻게 할 수 있니? –

+0

나는 이런 식으로 뭔가에 생각 : 'SECOND (nl.idConteudoNo = cn.idConteudoNo 및 TIMESTAMPDIFF ON conteudoNo CN 가입 cn.idConteudo, SUM navegacaolog NL FROM (TIMESTAMPDIFF (SECOND, nl.dataInicio, nl.dataFim)) 을 선택 , nl.dataInicio, nl.dataFim)> (120) CROSS 가입 utilizadortesteavaliacao의 우타 곳 uta.idUtilizador = nl.idUtilizador cn.idConteudo'에 의해 그룹하지만 does't 작업 중 하나 :( –

+0

체크 업데이트 쿼리 – Sebas

0

완료. 내가 진정으로 원했던 것은 다음과 같습니다 :

select Q1.idConteudo, Q2.PONTUACAO, Q1.TEMPO 
from 
    (select cn.idConteudoNo AS idConteudoNo, cn.idConteudo AS idConteudo,sum(TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim)) AS TEMPO 
     from navegacaolog nl 
      JOIN conteudoNo cn 
       ON nl.idConteudoNo = cn.idConteudoNo 

     where TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 

     group by cn.idConteudoNo) AS Q1 

    , 

    (select nl.idConteudoNo AS idConteudoNo, sum(uta.pontuacao) AS PONTUACAO 
     from navegacaolog nl 
      JOIN utilizadortesteavaliacao uta 
       ON nl.idUtilizador = uta.idUtilizador 
     where TIMESTAMPDIFF(SECOND, nl.dataInicio , nl.dataFim) > 120 

     group by nl.idConteudoNo 
    ) AS Q2 

WHERE 

    Q1.idConteudoNo = Q2.idConteudoNo 

하지만 모두 맞았습니다. 문제는 같은 것을 여러 번 세고 있다는 것입니다.모든

종류에

덕분에

관련 문제