Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么这个查询会使我的整个数据库冻结?_Mysql_Sql_Database - Fatal编程技术网

Mysql 为什么这个查询会使我的整个数据库冻结?

Mysql 为什么这个查询会使我的整个数据库冻结?,mysql,sql,database,Mysql,Sql,Database,您缺少任何将表相互关联的连接条件,因此正在执行3个表的笛卡尔连接 我建议始终使用显式连接语法 SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` WHERE `groupon-spain-6sep-2011`.`code`= 5654 OR `Hoja1`.`code` = "5654 OR `GroupaliaJuly2011`.`code` = 5654 尽管您可能希望在这里建立一

您缺少任何将表相互关联的连接条件,因此正在执行3个表的笛卡尔连接

我建议始终使用显式连接语法

SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` 
WHERE `groupon-spain-6sep-2011`.`code`= 5654 
    OR  `Hoja1`.`code` = "5654 
    OR `GroupaliaJuly2011`.`code` = 5654

尽管您可能希望在这里建立一个联合,但我认为无论如何?

您提出的查询涉及三个表的笛卡尔积(在标准SQL中也称为交叉连接,感谢@onedaywhen)的建议,所涉及的记录量将是大小(a)*大小(B)*大小(C)。因此,如果整个产品足够大,它将填充大量内存,这将使您的数据库无法响应任何其他请求,这将导致数据库“冻结”


我注意到您希望三个指定的列中的任何一个都是相同的值“5654”,因此您可以分别从三个表中选择元组,然后合并它们,而不是像现在这样对它们进行笛卡尔积,因为我认为您所做的笛卡尔积没有任何意义。这将节省大量内存。

您可能需要执行联合:

SELECT *
FROM   `groupon-spain-6sep-2011`
       JOIN `hoja1` ON `groupon-spain-6sep-2011`.foo=`hoja1`.foo
       JOIN `groupaliajuly2011` ON `groupaliajuly2011`.`foo` = `hoja1`.foo
WHERE  `groupon-spain-6sep-2011`.`code` = 5654
        OR `hoja1`.`code` = 5654
        OR `groupaliajuly2011`.`code` = 5654  

您编写的连接样式SQL与OP具有不同的含义。不能推断所涉及的列是OP的SQL中的外键。满足OP的SQL的元组只需要有一列等于“5654”,其他两列可以是任何东西,更不用说相等了。@Spirit-当然它有不同的含义。OP正在进行无意的交叉连接!我的回答演示了使用任意列名的联接语法,因为我们没有关于表结构或关系的信息。根据表名,我怀疑他们可能需要
UNION
而不是
JOIN
,正如我最后一行建议的那样。同意。也许SQL的笛卡尔乘积形式对于像OP这样的SQL新手来说似乎是一种联合操作。我怀疑SQL新手也会知道“笛卡尔乘积”的含义。+1但我想他可能也想知道“冻结”数据库的原因,这在我的回答中已经说明了。@Spirit Zang:是的。您和Martin都回答了这个问题,所以我不需要=)因此您需要+1。当然,您不应该使用select*(如果表具有不同的结构,那么它在联合中就不起作用)。OP也应该考虑工会是否会以更快的速度运作。但只有当所有记录都不能在多个表中时,它才会起作用。第一段很清楚,并回答了原因。第二个,不多。如何组合元组?在某种程度上,他已经在这样做了,将元组组合起来。如果您想使用
联合
,请编写它。@ypercube。我没有使用“联合”这个词,因为我不太确定他/她是否希望这样做。不管怎样,你的建议让它更清楚了。+1但我怀疑SQL新手会知道“笛卡尔乘积”是什么意思,除非他们有数学背景,即使这样,关系笛卡尔乘积也是不同的。你能用另一个词吗。例如,标准SQL调用它
交叉连接
。@onedaywhen-不幸的是在MySQL中,这有点混淆了这里的问题。@Martin Smith:我不知道!MySQL的古怪世界,嗯?看起来您已经了解了SQL-92之前标准联接语法的所有危险:)这就是隐式联接语法是反模式的原因。
SELECT * 
    FROM groupon-spain-6sep-2011
    WHERE code = 5654
UNION SELECT * 
    FROM Hoja1
    WHERE code = 5654
UNION SELECT * 
    FROM GroupaliaJuly2011
    WHERE code = 5654