Autor | Zpráva | ||
---|---|---|---|
Andrej.B Profil |
#1 · Zasláno: 9. 9. 2022, 09:30:58
Zdravim,
mam zobrazit datum /a vygenerovat link/, ktory sa nenachadza v tabulke historia za poslednych 365 dni. Moj kod je na to strasne pomaly ako sa plni tabulka dalsimi a dalsimi dnami. Kazdy den pribudne cca 3000-5000 zaznamov. Teraz mam zaznamov uz cca milion. Na zaciatku to preslo rychlo, teraz uz cakam aj minutu. Urcite musi existovat rychlejsia možnosť ako prechádzať Select 365 krat a porovnavat to s tym milionom zaznamov. Datum mam v DB ako datetime. Dakujem Moj kod: <?php $pocetdni je rozdiel medzi dneskom a spat do minulosti 365 dni for($i = $pocetdni; $i > 0; $i--) { $datum_sql = date("Y-m-d", strtotime("-$i days")); $q_history = " SELECT Datum FROM `historia` WHERE Datum = '$datum_sql' GROUP by Datum ORDER by Datum DESC "; $check_history = $conn->query($q_history); $count_history = $check_history->num_rows; if($count_history > 0) { // nezobrazujeme nic, ak existuje } else { echo 'generovanie linku s datumom, ktory neexistuje'; } ?> |
||
Kajman Profil |
#2 · Zasláno: 9. 9. 2022, 09:36:51
V mysql bych si udělal pomocnou tabulku s kalendářem. Z ní pak vypsal datumy, které se nepodaří slinkovat s historí a jsou v hledaném období.
|
||
Andrej.B Profil |
#3 · Zasláno: 9. 9. 2022, 11:50:44
takze by som mal tym padom generovat tuto tabulku vzdy nanovo, kazdy den a az potom pozerat ci sa tam nachadza?
|
||
anonym_ Profil * |
Možná hloupý dotaz, ale proč taháš ty dny jednotlivě a nevytáhneš všechny záznamy naráz?
WHERE datum >= '2022-09-09' ?
365 dotazů je určitě nesmysl, ať už zadání chápu jakkoliv. * WHERE datum >= '2021-09-09' samozřejmě, pokud se bavíme o posledním roce.
|
||
Kajman Profil |
#5 · Zasláno: 9. 9. 2022, 12:03:55
Andrej.B:
„generovat tuto tabulku vzdy nanovo, kazdy den“ Jen pokud to chcete dělat co nejsložitěji, co to jde. Pokud máte starou verzi mysql, nebo nemáte verzi pod kontrolou. Bude jistější udělat jednou tabulku s kalendářem, kde si dáte třeba 10 let zpátky a 50 dopředu (nebo ještě lépe naprogramujete postupné přidávání). Tu pak bude používat opakovaně. Také si můžete udělat pomocnou tabulku, kde budou řádky s čísly 1 až 365 a pomoci date_sub si vygenerujete seznam datumů za poslední rok. V nových verzích, co umí rekurzivní dotazy, lze udělat pomocnou tabulku přímo v dotaze... WITH RECURSIVE kalendar AS ( SELECT curdate() AS datum, 1 AS lev FROM DUAL UNION ALL SELECT date_sub(datum, INTERVAL 1 DAY), lev + 1 FROM kalendar WHERE lev < 365 ) SELECT k.datum FROM kalendar k LEFT JOIN historia h ON k.datum = h.datum WHERE h.datum IS NULL ORDER BY 1 Rychlost ovlivní index na sloupci datum v tabulce historia. |
||
Časová prodleva: 3 dny
|
|||
Andrej.B Profil |
#6 · Zasláno: 12. 9. 2022, 07:31:55
Tak som nakoniec vytvoril pomocnu tabulku s datumamy, ktore treba riesit. Vygenerovany link ma posle na funkciu, ktora po urobeni to co ma, este prida zaznam do tej tabulky.
Dakujem |
||
Časová prodleva: 3 roky
|
0