Autor Zpráva
Andrej.B
Profil
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
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
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
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.
Andrej.B
Profil
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0