2013-11-24 67 views
1

我需要對兩個表中的行進行計數,並且我想讓一個SQL查詢完成這項工作。經過一番研究,我發現,我修改,以這樣的一個解決方案:結合沒有JOIN或UNION的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查詢,意味着應該有任何性能改進)?

回答

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 
+0

我不認爲這會給OP一些性能上的好處! :) –

+0

你是對的,沒有任何好處,它是足夠快:) – nrathaus

0

意義應該有任何peformance改善相比,如果我 將有兩個獨立的SELECT查詢

那麼有沒有什麼好如果你想組合兩個表格,你爲什麼要避開JOINS和UNION。就性能問題而言,我不認爲使用JOINS會導致任何此類問題。另外要提到的是,UNION會將查詢中的行彼此放在一起,而JOIN製作笛卡爾產品並對它進行子集化,這是完全不同的操作。

順便說一句,你可能也喜歡閱讀:Bad habits to kick : using old-style JOINs,因爲我懷疑你是用舊的約定來連接表。

1

JOIN和UNION是不同的。

在您的查詢中,您使用了CROSS JOIN操作,因爲當您在兩個表格之間使用逗號時,您將應用CROSS JOIN。如果你在你的WHERE子句中放置了兩個表之間的鏈接,它會變成INNER JOIN,在你的情況下,成員和activate_account沒有鏈接。

當您想要從兩個不同的集合中獲取值時,可以使用UNION。即如果你想要一份員工名單和一份水手名單,假設的員工和水手是在兩張不同的表格中。

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回答