2013-09-26 23 views
1

我需要一些MySQL的幫助。可以說,我有這個疑問Q1: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

但是如果我 「從」 添加另一個表,讓說: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 

我不明白爲什麼,加入另一個表(不含在where子句中使用它)有這麼多重要的事實。有人可以給我一些幫助嗎?

親切的問候

+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烏塔 ' 其中\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

所以,像這樣:'從navegacaolog NL 選擇cn.idConteudo,SUM(TIMESTAMPDIFF(SECOND,nl.dataInicio,nl.dataFim)) JOIN conteudoNo CN ON nl.idConteudoNo = cn.idConteudoNo JOIN utilizadortesteavaliacao歌N1上.idUtilizador = uta.idUtilizador where TIMESTAMPDIFF(SECOND,nl.dataInicio,nl.dataFim)> 120 group by cn.idConteudo' right?不幸的是,它仍然不起作用,我認爲時間戳的總和不應該產生如此高的值 –

1

結果並沒有改變,只是每個結果已經被重複的次數等於在新表中的行數。 原因是你已經添加了新的表,沒有任何加入where子句,所以你有一個交叉連接。

+0

哼,好吧,我明白了。所以你告訴我,我必須在他們之間建立關係才能得到相同的結果。寫? –

+0

是的,如果沒有關係,那麼不要添加任何表。 – 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

嗯,我想要的是做這樣的事情:從navegacaolog NL '選擇cn.idConteudo,SUM(uta.pontuacao), \t \t SUM(TIMESTAMPDIFF(SECOND,nl.dataInicio,nl.dataFim)) ,conteudoNo CN, utilizadortesteavaliacao烏塔 其中\t nl.idConteudoNo = cn.idConteudoNo AND \t \t TIMESTAMPDIFF(SECOND,nl.dataInicio,nl.dataFim)> 120和 \t \t uta.idUtilizador = nl.idUtilizador 由cn.idConteudo分組' 我試圖使用連接來做到這一點,但迄今爲止,我得到的接近是茉莉花的答案。我現在想調整它來做我上面寫的東西。我怎樣才能做到這一點? –

+0

我想在這樣的:'選擇cn.idConteudo,SUM(TIMESTAMPDIFF(SECOND,nl.dataInicio,nl.dataFim)) FROM navegacaolog NL JOIN conteudoNo CN ON nl.idConteudoNo = cn.idConteudoNo和 TIMESTAMPDIFF(SECOND ,nl.dataInicio,nl.dataFim)> 120 CROSS JOIN utilizadortesteavaliacao烏塔 其中uta.idUtilizador = nl.idUtilizador 組由cn.idConteudo'但它簡化版,工作要麼:( –

+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 

但是,你所說的是正確的。問題在於它計數了幾次同樣的事情。

感謝所有

親切的問候

相關問題