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

Jak*_*ake 2 mysql sql database

SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` 
WHERE `groupon-spain-6sep-2011`.`code`= 5654 
    OR  `Hoja1`.`code` = "5654 
    OR `GroupaliaJuly2011`.`code` = 5654
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 9

您缺少任何与表相关的连接条件,因此正在进行3个表的笛卡尔连接.

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

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  
Run Code Online (Sandbox Code Playgroud)

虽然你可能想要一个联盟在这里,但我想呢?

  • @ Spirit-当然它有不同的含义.OP正在进行无意的交叉加入!我的回答演示了使用任意列名的连接语法,因为我们没有关于表结构或关系的信息.我怀疑基于表名,他们可能需要`UNION`而不是`JOIN`,正如我的最后一行所暗示的那样. (2认同)

Der*_*ang 6

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

我注意到你想要三个指定列中的任何一个是相同的值'5654',所以你可以分别从三个表中选择元组,然后UNION它们,而不是像你现在这样做它们的笛卡尔积,因为我不认为你制作的笛卡尔产品有任何意义.这将节省大量的内存.


jga*_*fin 6

你可能想做一个联盟:

SELECT * 
    FROM groupon-spain-6sep-2011
    WHERE code = 5654
UNION SELECT * 
    FROM Hoja1
    WHERE code = 5654
UNION SELECT * 
    FROM GroupaliaJuly2011
    WHERE code = 5654
Run Code Online (Sandbox Code Playgroud)