3

我有一个电话数据库,其中有一个“方向”字段,以呼叫的方向(进或出)命名。我的问题是,当我搜索“in”或“out”电话时,号码完全错误。

示例:
5 月份,
总来电(进 + 出):13622
来电:12637 外
来电:985

SELECT `start`, `direction`, `ref_id` 
FROM  `call_list` 
WHERE  `did` = 'xxxx' 
AND  `start` >= '2013-05-01 00:00:00' 
AND  `start` < '2013-06-01 00:00:00'

以上是基于将上述查询转储到 CSV 并实际查看列表的准确计数。但是,当我添加“方向”搜索时,返回的数字完全关闭:

SELECT `start`, `direction`, `ref_id` 
FROM  `call_list` 
WHERE  `did` = 'xxxx' 
AND  `start` >= '2013-05-01 00:00:00' 
AND  `start` < '2013-06-01 00:00:00' 
AND `direction` = 'In'

...将导致总数为 13461,并且

SELECT `start`, `direction`, `ref_id` 
FROM  `call_list` 
WHERE  `did` = 'xxxx' 
AND  `start` >= '2013-05-01 00:00:00' 
AND  `start` < '2013-06-01 00:00:00' 
AND `direction` = 'Out'

..产生的总计数为 11018。

因此,如果我分组:

SELECT `direction`, count(*)
FROM  `call_list` 
WHERE  `did` =  'xxxx'
AND  `start` >=  '2013-05-01 00:00:00'
AND  `start` <  '2013-06-01 00:00:00'
GROUP BY `direction`

...我得到了正确的计数,这一切都很好,除了有时我需要分别对“输入”或“输出”计数运行查询,所以我的数字是关闭的。

“方向”列是 varchar(3) utf8_unicode_ci。

如果有人能解释为什么我会收到流浪汉计数,我将不胜感激。

提前致谢

4

1 回答 1

2

一个疯狂的猜测,但获得比预期更多或更少行的常见原因之一是在没有适当括号OR的条件下使用 sWHERE

例如

SELECT `start`, `direction`, `ref_id` 
  FROM  `call_list` 
WHERE  `did` = 'xxxx' OR `did` = 'yyyy'  -- << here is the problem !!!
  AND  `start` >= '2013-05-01 00:00:00' 
  AND  `start` < '2013-06-01 00:00:00' 
  AND `direction` = 'In'

那应该是

SELECT `start`, `direction`, `ref_id` 
  FROM  `call_list` 
WHERE  (`did` = 'xxxx' OR `did` = 'yyyy') 
  AND  `start` >= '2013-05-01 00:00:00' 
  AND  `start` < '2013-06-01 00:00:00' 
  AND `direction` = 'In'

这是SQLFiddle演示

于 2013-07-01T20:00:33.860 回答