2010-11-08 46 views
0

SQL 1MySQL的計數問題

SELECT (
COUNT(contract.contract_notesid) + (SELECT COUNT(contract_notesid) 
FROM quotation WHERE quotation.contract_notesid = contract.contract_notesid) 

) AS total 

FROM contract where contract_notesid = '48' 

total 2

SQL 2

SELECT (
COUNT(contract.contract_notesid) + (SELECT COUNT(contract_notesid) 
FROM quotation WHERE quotation.contract_notesid = 48) 

) AS total 

FROM contract where contract_notesid = '48' 

total 6

contract table:2條記錄quotation table:4條記錄

1.爲什麼不同數?

2. SQL 2,有沒有什麼更好的辦法呢?(total: 6

+1

取決於你想要做什麼。你試圖完成什麼? – rwilliams 2010-11-08 08:02:08

+0

@ r-dub從2個表中獲得總數 – love 2010-11-08 08:04:56

+0

嘗試從表中手動計數contract_notesid = 48的合同...將您的手動結果與上面的兩個sql查詢進行比較......哪一個符合是正確的查詢。 – yonan2236 2010-11-08 08:06:53

回答

3

這些查詢是不等價的。您正在執行JOIN(笛卡爾積,然後修整結果集),但在第二個結果中,由於您在不同的條件下匹配,導致總計更高,所以結果重複。這兩者的「正確」的查詢取決於你想做什麼..

可能的解決方法 -

你「可能」會試圖做類似如下:

select count(contract.contract_notesid) + count(quotation.contract_notesid) 
from contract 
join quotation 
on contract.contract_notesid = quotation.contract_notesid 
where contract.contract_notesid = '48' 

但這是一個瘋狂的猜測,直到你提供更多的信息。

+0

我終於明白了,謝謝Alex。 – love 2010-11-08 08:10:28

+0

@Alex sql 2(共6個),有其他方法來查詢? – love 2010-11-08 08:13:49

+0

@LXXA請看我的更新 – Alex 2010-11-08 08:21:37

0

我不是MySQL專家(我知道一些Oracle),所以我會放棄猜測和回答你的第一個問題。

對於第二個問題: 你究竟在做什麼?

如果你想的records in the quotation table + number of records in the contract tablecontract_notesid = 48數量,那麼所有你需要的是

select 
(
    (select count(contract.contract_notesid) FROM contract where contract_notesid = '48') 
    + 
    (SELECT COUNT(contract_notesid) FROM quotation WHERE quotation.contract_notesid = 48) 
) as TOTAL 
from dual 

如果你想有一個與之相關的所有合同報價的數量爲contract_notesid = 48,那麼你就需要一個連接:

SELECT COUNT(*) as total 
    FROM quotation quotation, 
     contract contract 
WHERE quotation.contract_notesid = contract.contract_notesid 
    AND quotation.contract_notesid = '48' 
+0

@Nivas sql2總數:8只有2個表中有6個 – love 2010-11-08 08:32:13

+0

''contract_notesid ='48'?' – Nivas 2010-11-08 08:39:27

+0

'合約表':2條記錄'報價單表': 4記錄 – love 2010-11-08 08:42:01

0

我注意到,在quotation.contract_notesid = 48的選擇,但在合同中選擇where contract_notesid = '48' - 後者被引用,而前者則不是。這意味着引用和合同字段是不同的類型,並且查詢正在進行一些隱式轉換。

我建議在第一個查詢的WHERE子句中明確地將數字字段轉換爲字符串。

+0

回報是一樣的。 – love 2010-11-09 04:14:49