Объединить две или более строк из результата в один результат в CI activerecord

#codeigniter #activerecord #phpactiverecord

#codeigniter — инициализатор кода #активная запись #phpactiverecord phpactiverecord

Вопрос:

У меня такая ситуация, я хочу получить значение из базы данных (в этих значениях используются разделители через запятую) из более чем одной строки в зависимости от месяца и года, которые я выбираю, для более подробной информации ознакомьтесь с этим..

Мой Schedule.sql :

  --- ------------ ------------------------------------- 
|ID |Activ_date  | Do_skill                            |
 --- ------------ ------------------------------------- 
| 1 | 2020-10-01 | Accountant,Medical,Photograph       |
| 2 | 2020-11-01 | Medical,Photograph,Doctor,Freelancer|
| 3 | 2020-12-01 | EO,Teach,Scientist                  |
| 4 | 2021-01-01 | Engineering, Freelancer             |
 --- ------------ ------------------------------------- 
 

Мой skillqmount.sql :

  ---- ------------ ------------ ------- 
|ID  |Date_skill  |Skill       |Price  |
 ---- ------------ ------------ ------- 
| 1  | 2020-10-02 | Accountant | $ 5   |
| 2  | 2020-10-03 | Medical    | $ 7   |
| 3  | 2020-10-11 | Photograph | $ 5   |
| 4  | 2020-10-12 | Doctor     | $ 9   |
| 5  | 2020-10-01 | Freelancer | $ 7   |
| 6  | 2020-10-04 | EO         | $ 4   |
| 7  | 2020-10-05 | Teach      | $ 4   |
| 8  | 2020-11-02 | Accountant | $ 5   |
| 9  | 2020-11-03 | Medical    | $ 7   |
| 10 | 2020-11-11 | Photograph | $ 5   |
| 11 | 2020-11-12 | Doctor     | $ 9   |
| 12 | 2020-11-01 | Freelancer | $ 7   |
 ---- ------------ ------------ ------- 
 

На моем веб-сайте я хочу произвести вычисления с этими двумя таблицами. Поэтому, если на моем веб-сайте вы хотите увидеть начало с даты 2020-10-01 до 2020-11-01 для общей суммы между этими датами, я пытаюсь показать это с помощью этого кода :

Пример вывода

  ---- ----------- ----------- --------- 
|No  |Date Start |Date End   |T.Amount |
 ---- -------- -- ----------- --------- 
|1   |2020-10-01 |2020-11-01 |$ 45     | <= this amount came from $5 $7 $5 $7 $5 $9 $7
 ---- -------- -- ----------- --------- 

Note : 
Date Start : Input->post("A")
Date End : Input->post("B")
T.Amount : Total Amount based input A and B (on date)
 

Я попробовал этот код, чтобы получить его :

 <?php 
$startd = $this->input->post('A');
$endd= $this->input->post('B');
$chck = $this->db->select('Do_skill')
                    ->where('Activ_date >=',$startd)
                    ->where('Activ_date <',$endd)
                    ->get('Schedule')
                    ->row('Do_skill');
$dcek = $this->Check_model->comma_separated_to_array($chck);
$t_amount = $this->db->select_sum('price')
                    ->where('Date_skill >=',$startd)
                    ->where('Date_skill <',$endd)
                    ->where_in('Skill',$dcek)
                    ->get('skillqmount')
                    ->row('price');

echo $t_amount; ?>
 

Check_model :

 public function comma_separated_to_array($chck, $separator = ',')
{
  //Explode on comma
  $vals     =   explode($separator, $chck);
  $count    =   count($vals);
  $val      =   array();
  //Trim whitespace
  for($i=0;$i<=$count-1;$i  ) {
    $val[]   .=   $vals[$i];
  }
  return $val;
}
 

Моя проблема — результат $t_amount не 45 долларов, я думаю, что в моем коде выше есть какой-то промах, пожалуйста, если есть какие-то советы, я очень ценю это…Спасибо…

Комментарии:

1. неужели ваша проблема решена?

2. T.Сумма = $5 $7 $5 $9 $7 $4 $4 $7 = 48. фильтр между 2 датами.

Ответ №1:

Ваш первый запрос возвращает только 1 строку данных.

Я думаю, вы можете сделать что-то подобное для первого запроса.

 $query1 = $this->db->query("SELECT Do_skill FROM schedule WHERE activ_date >= $startd and  activ_date < $startd");
        $check = $query1->result_array();
        $array = [];

        foreach($check as $ck){
            $dats = explode(',',$ck['Do_skill']);
            
            $counter = count($dats);

            for($i=0;$i<$counter;$i  ){
                array_push($array,$dats[$i]);
            }
 

и вы можете использовать массив для выполнения вашего следующего запроса 🙂

Комментарии:

1. йой бро @karisma

Ответ №2:

Массив $ dcek содержит значения

 Accountant,Medical,Photograph
 

Запрос от Codeigniter

 SELECT SUM(`price`) AS `price` FROM `skillqmount` 
WHERE `Date_skill` >= '2020-10-01' AND 
`Date_skill` < '2020-11-01' AND 
`Skill` IN('Accountant', 'Medical', 'Photograph')
 

который возвращает 17 — это соответствует первым трем записям в ваших данных.

Ваш первый запрос будет выдавать только одну строку, даже если диапазон дат будет соответствовать нескольким строкам.

Комментарии:

1. итак, каково ваше предложение по решению моей проблемы? Я некоторое время искал, чтобы использовать concat для объединения всех значений Do_skill , но я не знаю, как его использовать в этом случае. можете ли вы мне помочь?

2. Какие значения идентификаторов вы использовали, чтобы получить ответ за 45 долларов?

3. просто дата, я не использую ID

4. $5 $7 $5 $7 $5 $9 $7 пришло из Accountant Medical Photograph 10-го и Medical Photograph Doctor Freelancer 11-го месяцев, потому что ввод даты выбора начинается с Okt по ноябрь