在没有JOIN或UNION的情况下组合SQL查询

时间:2013-11-24 14:38:56

标签: sql

我需要计算两个表中的行,我想做一个SQL查询来完成这项工作。经过一些研究后,我找到了一个解决方案,我对此进行了修改:

SELECT COUNT(activate_account.id), COUNT(members.id) FROM members, activate_account 
WHERE members.email = :email or activate_account.email = :email

现在我的问题是:这是一个很好的方法来组合两个SELECT查询,这是一个很好的解决方案,好像我会使用JOIN或UNION(意味着应该有任何性能改进相比,如果我有两个单独的SELECT查询)?

4 个答案:

答案 0 :(得分:1)

JOIN和UNION是不同的。

在您的查询中,您使用了CROSS JOIN操作,因为当您在两个表之间使用逗号时,您应用CROSS JOIN。如果您在WHERE子句中放置两个表之间的链接,在您的情况下成员和activate_account没有链接,它就变为INNER JOIN。

当您想要从两个不同的集合中获取值时,可以使用UNION。也就是说,如果你想要一份员工清单和一份水手清单,假设,员工和水手都在两个不同的表格中。

答案 1 :(得分:1)

可能是迟到的回复,但下面会有效

SELECT tblactivate_account.activate_account, tblmembers.members
FROM 
( SELECT COUNT(activate_account.id) activate_account 
WHERE activate_account.email = email ) tblactivate_account,
( SELECT COUNT(members.id) members FROM members
WHERE members.email = email ) tblmembers

对nrathaus回答的修改

答案 2 :(得分:0)

您需要创建两个单独的查询并加入他们的结果而不是加入他们的表。

一些伪未经测试的SQL但应该可以工作:

SELECT tblactivate_account.activate_account, tblmembers.members
FROM 
( SELECT COUNT(activate_account.id) activate_account 
  WHERE activate_account.email = :email ) AS tblactivate_account,
( SELECT COUNT(members.id) FROM members
  WHERE members.email = :email ) AS tblmembers

答案 3 :(得分:0)

  

意味着与我相比,是否应该有任何改进   会有两个单独的SELECT查询

如果要组合两个表,没有充分的理由可以避免使用JOINS和UNION。就性能问题而言,我不认为使用JOINS会引发任何此类问题。还要提到UNION将查询中的行放在彼此之后,而JOIN生成笛卡尔积和子集,这是一个完全不同的操作。

顺便说一下,您可能还想阅读:Bad habits to kick : using old-style JOINs因为我怀疑您使用较旧的约定来连接表格。