mysql计数问题

时间:2010-11-08 07:59:39

标签: sql mysql

SQL 1

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

3 个答案:

答案 0 :(得分: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'

但在您提供更多信息之前,这是一个疯狂的猜测。

答案 1 :(得分:0)

我不是MySQL专家(我知道一些Oracle),所以我不会猜测并回答你的第一个问题。

对于你的第二个问题: 你到底想要完成什么?

如果您希望records in the quotation table + number of records in the contract table的数量为contract_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'

答案 2 :(得分:0)

我注意到quotation.contract_notesid = 48上的选择,但合同上的选择是where contract_notesid = '48' - 引用后者,而前者不是。{这意味着引用和契约字段具有不同的类型,并且查询正在进行一些隐式转换。

我建议在第一个查询的WHERE子句中明确地将数字字段转换为字符串。