Как уменьшить нагрузку на сервер, когда нам нужно выполнить одни и те же запросы несколько раз с небольшим изменением условия - PullRequest
0 голосов
/ 12 июня 2018

РЕДАКТИРОВАТЬ

лучше ли объединять все запросы в одном единственном выборе, например select (select...) as q1, (select...) as q2

КОНЕЦ РЕДАКТИРОВАНИЯ

Мне нужно выполнять одни и те же следующие запросы для каждого месяца года.

Разница между каждым запросом заключается просто в добавлении group by или удалении условия sing.

Первый запрос : мне нужно подсчитать общее количество посещений

SELECT 
    count(*)
from 
    visit 
where 
    visit_status='Active' 
AND 

    month(visit.date_of_visit)=month(:selectedDate)
AND
    year(visit.date_of_visit)=year(:selectedDate)

, конечно :selectedDate будет устанавливаться связыванием значений в PHP.

Второй запрос : подсчет количества пациентов (не посещений), и это можно сделать, просто добавив group by visit.patient_id

SELECT 
    count(*)
from 
    visit 
where 
    visit_status='Active' 
    AND 

        month(visit.date_of_visit)=month(:selectedDate)
    AND
        year(visit.date_of_visit)=year(:selectedDate)
group by visit.patient_id

И затем я буду использовать rowCount, чтобы получить результат в качестве возвращаемого значенияявляются строками из-за group by.

Те же запросы должны повторяться, но теперь без даты, что означает подсчет с момента первой регистрации данных в системе:

SELECT 
    count(*)
from 
    visit 
where 
    visit_status='Active' 

group by visit.patient_id

У меня нет ошибок, используя следующий метод, но есть ли лучший способ сделать это и уменьшить загрузкуг на сервере путем минимизации количества запросов?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Предполагая, что patient_id не является NULL, вы должны написать запрос как:

select count(distinct v.patient_id)
from visit v
where v.visit_status = 'Active' and
      v.date_of_visit >= :selectedDate - interval (1 - day(:selectedDate)) day and
      v.date_of_visit < last_day(:selectedDate) + interval 1 day;

Это гораздо лучший способ написать запрос, особенно если вы заботитесь о производительности:

  • Это может использовать индекс для visit(visit_status, date_of_visit, patient_id).
  • Вы возвращаете только то, что действительно хотите - количество уникальных пациентов.
  • Вы можете удалить условие where на дате, чтобы получить все даты.
0 голосов
/ 12 июня 2018

Попробуйте это.

select COUNT(distinct (visit.patient_id))  from visit where  visit_status='Active' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...