За последние 24 часа нас посетили 22624 программиста и 1546 роботов. Сейчас ищут 916 программистов ...

Как грамотно вставить условие в три sql запроса?

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 23 ноя 2018.

  1. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день. Есть функция которая опрашивает три таблицы из базы данных, выглядит так:
    (запросы не полные, просто пример)
    PHP:
    1. // первый запрос
    2. $this->db->select();
    3. $this->db->where("Date BETWEEN DATEADD(hour,".$a.", DATEDIFF(dd, 0, GETDATE()))
    4. AND DATEADD(hour,".$b.", DATEDIFF(dd, 0, GETDATE()))");
    5. if($checkPlanDowntime[0] === 1){
    6.      $this->db->where("Date NOT BETWEEN '".$checkPlanDowntime[1]."'
    7.     AND DATEADD(hour, 19, DATEDIFF(dd, 0, GETDATE()))", NULL, FALSE);
    8. }else if($notBetween !== null){
    9.   foreach ($notBetween as $value){
    10.    $this->db->where("Date NOT BETWEEN '".date('Y-d-m H:i:s', strtotime($value['Start_date']))."'
    11.     AND '".date('Y-d-m H:i:s', strtotime($value['End_date']))."'", NULL, FALSE);
    12. }
    13. }
    14. $query = $this->db->get('database');
    15.  
    16. //второй запрос
    17. $this->db->select();
    18. $this->db->where("Date BETWEEN DATEADD(hour,".$a.", DATEDIFF(dd, 0, GETDATE()))
    19. AND DATEADD(hour,".$b.", DATEDIFF(dd, 0, GETDATE()))");
    20. $query1 = $this->db->get('database');
    21.  
    22. //третий запрос
    23. $this->db->select();
    24. $this->db->where("Date BETWEEN DATEADD(hour,".$a.", DATEDIFF(dd, 0, GETDATE()))
    25. AND DATEADD(hour,".$b.", DATEDIFF(dd, 0, GETDATE()))");
    26. $query2 = $this->db->get('database');
    27.  
    28. return [$query->result_array(), $query2->result_array(), $query2->result_array()];
    Код получился громоздким.
    Меня смущает вот это вот дублирование на всех трех запросах:
    PHP:
    1. // это есть везде
    2. $this->db->where("Date BETWEEN DATEADD(hour,".$a.", DATEDIFF(dd, 0, GETDATE()))
    3. AND DATEADD(hour,".$b.", DATEDIFF(dd, 0, GETDATE()))");
    4.  
    5. //это надо добавить на остальные два запроса
    6. if($checkPlanDowntime[0] === 1){
    7.  
    8.     $this->db->where("Date NOT BETWEEN '".$checkPlanDowntime[1]."'
    9.     AND DATEADD(hour, 19, DATEDIFF(dd, 0, GETDATE()))", NULL, FALSE);
    10.  
    11. }else if($notBetween !== null){
    12.      foreach ($notBetween as $value){
    13.          $this->db->where("Date NOT BETWEEN '".date('Y-d-m H:i:s', strtotime($value['Start_date']))."'
    14.        AND '".date('Y-d-m H:i:s', strtotime($value['End_date']))."'", NULL, FALSE);
    15.       }
    16. }
    Можно ли убрать как то это дублирование, засунуть в функцию например?
    --- Добавлено ---
    Чтобы код выглядел как то так:
    PHP:
    1. $this->db->select();
    2. $this->beetwen();
    3. $query = $this->db->get('database');
    4.  
    5. //второй запрос
    6. $this->db->select();
    7. $this->beetwen();
    8. $query1 = $this->db->get('database');
    9.  
    10. //третий запрос
    11. $this->db->select();
    12. $this->beetwen();
    13. $query2 = $this->db->get('database');
    14.  
    15. return [$query->result_array(), $query2->result_array(), $query2->result_array()];
    16.  
    17. public function beetwen(){
    18. // перенести все сюда
    19. }
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Artur_hopf ты про создание пользовательских функций в mysql?
     
  3. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @abrdabr Нет, я думал можно как то код уменьшить, написал уже как есть, все работает :) Пользуюсь mssql только я и codeigniter.
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Artur_hopf тогда тупо задать переменной значение типа
    $a="date choto...was long";
    query("$a real_query");
    --- Добавлено ---
    но это тупо...
     
  5. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @abrdabr Да и так работает, спасибо =)
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Artur_hopf полагаю, до оптимизация и удобочитаемость это научная фантастика...