2012-06-11 20 views
1

我有这样的代码:笨2.1 - MySQL和正则表达式

function mgl_get_by($col,$id) 
      {  
      $this->db->select('*'); 
      $this->db->from('global_info'); 
      $this->db->join('ad', 'id_ad = id_global_info'); 
      $this->db->where('info_type_id', 1); 
      $this->db->where($col, $id); 
      $this->db->or_where("$col REGEXP $id"); 
      $this->db->order_by('paid', 'desc'); 
      $this->db->order_by('date_created', 'desc'); 
      $q = $this->db->get();   
      return $q = $q->result_array(); 
    } 

$山坳是在表中的行的名称,的$ id是查询唯一的ID。 在大多数情况下,它是唯一的编号,但是我在此表中有日期行,并且在表中它作为时间戳插入,但是在执行查询时,它需要选择所选日期的所有匹配(例如,它需要选择全部数据来自2012-06-11)。我该怎么做(我不熟悉REGEXP)?

+0

你能否进一步解释你在这里做什么?很不清楚为什么你要提供一个行的名字来匹配一个id。你的桌子有什么结构?日期是否存储为实际的DATE值? – thomaux

回答

1

我不认为你需要RegExp在这里 - LIKE会很好。如果你的日期存储为时间戳,你应该这样做:FROM_UNIXTIME($col) LIKE '2012-06-11'

编辑:虽然它效率不高。更好的方法是将时间戳比较为整数:

$col >= UNIX_TIMESTAMP('2012-06-11 00:00:00') AND $col < UNIX_TIMESTAMP('2012-06-12 00:00:00') 
+0

这是一个拥抱的情况。有一个简单的方法来做到这一点,但我想努力做到这一点。谢谢你的帮助:) – Sasha

+1

这太可怕了。你正试图比较两个数字,这是SQL的好处。该解决方案将数字转换为文本进行比较,该转换无法获得索引(并且不一定会正确发生),并且您最终会让sql做各种不必要的工作。请参阅:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx – evan

+0

@evan的确如此。 – scriptin

1

我从来没有见过这样做与REGEXP。

如果你想在某一天的一切,你真正想要的是:
2012-06-11 < =(日期)和(日期)< 2012-06-12

检查$关口,如果它是你的日期列,那么做日期范围,如果不是,则执行你已有的where子句。