Запрос с несколькими WHERE и CASE PHP (CodeIgniter) MySQL - PullRequest
1 голос
/ 21 апреля 2020

Я хотел бы выбрать весь период текущего срока (как сейчас FY80) + только 3 периода последнего периода (FY79) из таблицы m_period

Вот таблица m_period выглядит:

+----+------+-------------+--------+
| id | term | period      | status |
+----+------+-------------+--------+
|  1 | FY79 | 79::2020/01 | close  |
|  2 | FY79 | 79::2020/02 | close  |
|  3 | FY79 | 79::2020/03 | close  |
|  4 | FY79 | 79::2020/04 | close  |
|  5 | FY79 | 79::2020/05 | close  |
|  6 | FY79 | 79::2020/06 | close  |
|  7 | FY80 | 80::2020/07 | open   |
|  8 | FY80 | 80::2020/08 | open   |
|  9 | FY80 | 80::2020/09 | open   |
| 10 | FY80 | 80::2020/10 | open   |
| 11 | FY80 | 80::2020/11 | open   |
| 12 | FY80 | 80::2020/12 | open   |
| 13 | FY80 | 80::2021/01 | open   |
| 14 | FY80 | 80::2021/02 | open   |
| 15 | FY80 | 80::2021/03 | open   |
| 16 | FY80 | 80::2021/04 | open   |
| 17 | FY80 | 80::2021/05 | open   |
| 18 | FY80 | 80::2021/06 | open   |
+----+------+-------------+--------+

мой php скрипт застрял отсюда:

<?php

function getPeriod()
{
    $prev_term = (int)substr($this->session->userdata('term'),2,2) - 1;
    $this->db->select('period');
    $this->db->where('term', $this->session->userdata('term'));
    $this->db->where('term', $prev_term);
    $this->db->order_by('period', 'ASC');
    return $this->db->get('m_period')->result_array();
}

Я прочитал CI документации и не могли найти, как использовать CASE в codeigniter, или есть другой способ вместо использования CASE? кто-нибудь может мне помочь, как это сделать?

Примечание: я сохраняю текущий термин в сеансе

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете использовать limit () метод.

Затем вам нужно иметь две отдельные функции.

function getPrevPeriod()
{
    $prev_term = (int)substr($this->session->userdata('term'),2,2) - 1;
    $this->db->select('period');
    $this->db->where('term', $prev_term);
    $this->db->order_by('period', 'ASC');
    $this->db->limit(3);
    return $this->db->get('m_period')->result_array();
}

function getCurrentPeriod()
{
    $this->db->select('period');
    $this->db->where('term', $this->session->userdata('term'));
    $this->db->order_by('period', 'ASC');
    return $this->db->get('m_period')->result_array();
}

Затем вы можете использовать array_merge() для объединить массивы.

$periods = array_merge($prev, $current);

Редактировать: С одним запросом

function getPeriod()
{
    $prev_term = (int)substr($this->session->userdata('term'),2,2) - 1;
    $this->db->select('term','period');
    $this->db->or_where_in('term',[$this->session->userdata('term'),$prev_term])
    $this->db->order_by('period', 'ASC');
    $result = $this->db->get('m_period')->result_array();
    $output = [];
    $n = 0;
    foreach($result as $row){
         if($row["term"] == $prev_term){
              if($n <= 3){
                   $output[] = $row;
                   $n++;
              }
         }else{
              $output[] = $row;
         }
    }

    return $output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...