большой SQL-запрос работает очень медленно при фильтрации даты, встроен в переполнение стека

Я нет SQL Pro вообще, и этот запрос взял у меня много. Все работает нормально, пока не доходит до Дата-фильтрации.
Этот запрос встроен в код PHP.
Во-первых, пользователь может установить фильтры, например, фильтр области пользователя. После нажатия кнопки фильтра загружается определенный оператор SQL. Все работает очень хорошо при фильтрации пользователей, статуса и области. Это немного медленно, но терпимо. Но когда я использую фильтр даты, все утверждения загружаются почти за одну минуту, что совсем не круто. Я много читал о фильтрации дат по SQL, но ничего не помогло (или я не понял). Я сделал ошибку нуба? Как я уже говорил, время от времени я пишу операторы SQL, но я об этом не знаю.

$userstatement = "AND BenutzerId ='".$benutzerfilter."'"; // asd1134
$statusstatement = "AND s.Name ='".$statusfilter."'"; // ie "deleted"$areastatement = "AND b.Name ='".$areafilter."'"; // ie "Video"$selected_date = $datefilter_from; // ie '2018-01-01'
$monthfilter = 2; //possible values 1-24$bigQuery = "SELECT * FROM (  SELECT r.id, r.BenutzerId as BenutzerId,  equi.Bezeichnung, equi.VerleihprioritaetId, r.EquipmentId as eId, r.res_von, r.res_bis, equi.TypId, t.Name as TypName, r.Kommentar_user, s.Name as Status, b.Name as Bereich, b.Id as BereichId, btzr.Vorname, btzr.Nachname, IF(pe.Id,true,false) AS inPaket,
(  SELECT  max(gr.verleihstufe) as Verleihstufe
FROM benutzeringruppe as bengr
left join benutzergruppen as gr
on bengr.gruppenid = gr.Id
left join benutzer as ben
on bengr.benutzerid = ben.Id
where ben.id = r.BenutzerId
AND gr.bereichid = b.Id
group by ben.id  ) as Verleihstufe,
(  SELECT true
FROM benutzeringruppe as bg
LEFT JOIN direktberechtigung as d2
ON bg.gruppenid = d2.gruppenid
WHERE bg.benutzerid = r.BenutzerId
AND d2.equipmentid = r.EquipmentId LIMIT 1)
as EquipmentDirektberechtigt
FROM reservierung as r
left join equipment as equi
on r.EquipmentId = equi.Id
left join typ as t
on equi.TypId = t.Id
left join status as s
on r.StatusId = s.Id
left join bereich as b
on equi.BereichId = b.Id
left join direktberechtigung as d
on r.EquipmentId = d.equipmentid
left join paketEq as pe
on r.EquipmentId = pe.EquipmentId
left join benutzer as btzr
on r.BenutzerId = btzr.Id
Where r.res_von > '$selected_date'
AND r.res_von < DATE_ADD
('" .$selected_date. "', INTERVAL ".$monatsfilter." MONTH)
".$statusstatement." ".$userstatement." ".$areastatement.")
AS Big
Order by Big.res_von DESC";

0

Решение

Использование DATE_ADD предотвратит кеширование запросов, поэтому вы можете повысить производительность, предварительно рассчитав дату в PHP с помощью чего-то вроде:

$startdate = new DateTime($selected_date);
$startdate->modify('-' . $monthfilter . ' month');

а затем сделать:

AND r.res_von < '" . $startdate->format('Y-m-d') . "'
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector