mysql - SQL 查询 : why does adding another table change the results?

标签 mysql sql

我需要一些 MySQL 方面的帮助。假设我有这个查询 Q1:

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

但是,如果我将另一个表添加到“from”,假设: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 子句中使用它)这一事实如此重要。有人可以给我一些帮助吗?

亲切的问候

最佳答案

您没有指定连接条件,所以您得到的是 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

关于mysql - SQL 查询 : why does adding another table change the results?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033451/

相关文章:

mysql - 在使用 'OR' 时不使用索引键

mysql - 使用 gzip 运行 innobackupex 并将显示输出管道显示到文件

php - 带有图像的列表中的动态下拉选项

javascript - 使用 JS 时如何隐藏 pubnub key

MySQL Max 字段错误

python - 无法让 mySQL.connector 下载/工作?

php - Mysql如何连接2个表和1个表本身

mysql连接同一个表不同的结果集

mysql - ERROR 1118 (42000) 行大小太大

mysql - SQL从2个表中选择,其中键不在1个表的某些行中