无法在SQL中按组行过滤行

时间:2019-07-15 06:34:12

标签: php mysql codeigniter codeigniter-3

我有一个表,其中有一个开始日期和结束日期,这些行按唯一ID分组,例如行ID 4,5有group_identify_id 5700045,行ID 1,2,3有group_identify_id 5700044.我只需要选择组中所有行的起始列均大于当前日期的那些组。例如。如果当前日期是15,则不应在结果中显示5700045。

id                start                       end        group_identify_id

1          2019-07-18 07:15:00  2019-07-18 08:15:00          5700044
2          2019-07-16 07:15:00  2019-07-16 08:15:00          5700044
3          2019-07-17 07:15:00  2019-07-17 08:15:00          5700044
4          2019-07-15 07:15:00  2019-07-15 08:15:00          5700045
5          2019-07-14 07:15:00  2019-07-14 08:15:00          5700045

结果应该是这样的:

  

结果:

1          2019-07-18 07:15:00  2019-07-18 08:15:00          5700044
2          2019-07-16 07:15:00  2019-07-16 08:15:00          5700044
3          2019-07-17 07:15:00  2019-07-17 08:15:00          5700044

我正在尝试这样的事情:

$results =  $this->db->where('where('DATE(start) >=',$currentDate)->get('schedule_diary')->result();    

但它匹配整个行而不是行组。

6 个答案:

答案 0 :(得分:1)

下面是原始查询,它将为您提供所需的结果。

SELECT * FROM schedule_diary WHERE group_identify_id NON IN ( SELECT group_identify_id FROM schedule_diary WHERE start  <= $currentDate) );

您需要将此查询转换为CodeIgniter Framework,或者也可以使用$ this-> db-> query('RawQueryHere')

答案 1 :(得分:1)

更新 如果在group_identify_id 中具有空值,则可以使用类似的测试

  /*Firstly, you should to select a set of rows whiches not in date*/
    $this->db->where('t1.group_identify_id = schedule_diary.group_identify_id');
    $this->db->where('DATE(t1.start) <= GETDATE()');
    $subquery = $this->db->get_compiled_select('schedule_diary as t1', TRUE);

  /*For last, you select all rows not exists in the subquery set.*/
    $this->db->where("not exists ($subquery)");
    $query = $this->db->get('schedule_diary');

    if($query){
      return $query->result_array();
    }

我认为这是适合您的代码!

答案 2 :(得分:0)

我不确定,但是我认为这个where很奇怪:

$results =  $this->db->where('where('DATE(start) >=',$currentDate)->get('schedule_diary')->result();

尝试在查询中将其删除:

$results =  $this->db->where('DATE(start) >=',$currentDate)->get('schedule_diary')->result();

答案 3 :(得分:0)

使用此原始查询或将其转换为可识别代码的格式

SELECT * FROM schedule_diary WHERE DATE(START) > "$currentDate" AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM test_1 WHERE DATE(START) <= "$currentDate")

它将完美运行。

工作屏幕截图。

SELECT * FROM schedule_diary WHERE DATE(START) > date("2019-07-14") AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM schedule_diary WHERE DATE(START) <= date("2019-07-14"))

enter image description here

答案 4 :(得分:0)

尝试此查询:

$this->db->where('start >', $currentDate)->get('schedule_diary')->result(); 

答案 5 :(得分:0)

您可以尝试这种原始查询

HttpServletRequest#getParameterValues()

您可以使用codeigniter

select * from schedule_diary group by group_identify_id having start > CURDATE()