2013-07-01 106 views
1

我正在根据用户选择的日期从数据库中提取数字数据。出于某种原因,当我选择我的函数来提取今天的所有数据(没有)时,它仍然会形成一个空值数组。使用CodeIgniter向数组返回空值的数据库查询?

我在考虑问题在于select_sum()或where()函数。这里是我的CI查询:

$this->db 
      ->select_sum('column1') 
      ->select_sum('column2') 
      ->select_sum('column3') 
       ->where('created_at >=', date('Y-m-d')); 
      $query = $this->db->get('table_name'); 

,这里是整个页面中使用我的foreach循环拉所有选定的数据到一个数组:

$popular_items_array = array(); 
     foreach ($query->result() as $key => $row) 
     { 
      if ($row == NULL) { 
       echo "Error populating table."; 
      } else { 
      $popular_items_array = $row; 
      } 
     } 

要看看数据,然后我做:

echo json_encode($popular_items_array); 

果然出这一点:

{"column1":null,"column2":null,"column3":null} 

如果我选择不同的时间范围(数据实际存在于设定的日期),则相同的JSON回显将显示现有数据。我不理解的是,为什么查询返回任何东西?为什么它不是失败?我怎样才能运行一个能够解决这个问题的检查/循环,并显示一条错误消息,让用户知道该日期没有数据?

+0

什么是$ this-> db-> last_query();在$ query = $ this-> db-> get('table_name');之后返回线?看看实际的查询是什么样的,我会很有兴趣。 –

+0

@DazzKnowles查询看起来像这样 SUM('column1')AS column1,SUM('column2')AS column2,SUM('column3')AS column3 FROM('table_name')WHERE'created_at'> ='2013 -07-01' – Spookytheboy

回答

3

如果您更愿意获得根本没有记录,你可以修改你的代码:

$this->db 
    ->select_sum('column1') 
    ->select_sum('column2') 
    ->select_sum('column3') 
     ->where('created_at >=', date('Y-m-d')) 
     ->having('count(*) > 0'); 
$query = $this->db->get('table_name'); 
+0

嗯,所以添加“有()”将停止查询,但我怎么能够检查它失败?这是真正的问题 - 显示这些总和查询是否确实在做相关的事情。 – Spookytheboy

+0

修正了这个问题,我添加了一个if语句,说if(empty($ popular_items_array) – Spookytheboy

1

这就是聚合函数(如sum(),avg(),max()等)的工作方式,它们将返回结果集合中的值。如果结果集是空的,他们会聚合。这造成很多confusionbugreports但是这是这应该是如何工作的,更详细的解释can be found at dba.stackexchange.com

您可以使用COALESCENULL值替换到更有用的东西,或者你可以添加一个count()这样你就可以告诉你怎么许多行被用于生成sum()

奇怪的是,如果添加了一组由它的工作如你所愿(至少与MySQL):

SELECT sum(id) sum_id FROM `users` WHERE 0 # => array(array('sum_id' => null)) 

但是:

SELECT sum(id) FROM `users` WHERE 0 GROUP BY null # => array()