Autor Zpráva
arkjnu
Profil *
Dobrý den,
pomocí databáze MySQL a PHP vytvářím zdarma program pro sportovní neziskovou organizaci, který spravuje evidenci předplacených vstupů. Nyní jsem narazil na jeden problém a prosím o pomoc. Zjednodušený popis situace:

Mám dvě MySQL tabulky, v první (č.1) je evidováno zakoupení předplacených vstupů, má tedy sloupce ID_predplacenky, TERMIN_expirace, POCET_vstupu. Ve druhé tabulce (č.2) se eviduje čerpání zakoupených vstupů. Ta má sloupce ID_cerpani, ID_predplacenky_cerpani. (Ve skutečnosti mají tabulky ještě více sloupců, ale to není pro tento případ podstatné, každý jeden záznam v tabulce č.2 znamená čerpání jednoho vstupu z předplacenky jejíž id je ve sloupci ID_predplacenky_cerpani). Nyní potřebuji zjistit ID_predplacenky, která bude co nejdříve expirovat, ale jsou na ní ještě nějaké volné vstupy. A též celkový počet předplacených vstupů. Slovně tento příkaz vypadá takto:

Z tabulky č.1 vyber všechny předplacenky, jejichž datum expirace je větší než dnešní datum (tzn. které ještě neexpirovali) a setřiď je vzestupně podle data expirace. Poté procházej postupně nalezené záznamy a u každého hodnotu POCET_vstupu porovnej s počtem nalezených záznamů v tabulce č.2, které mají ve sloupci ID_predplacenky_cerpani číselnou hodnotu stejnou jako je ID_predplacenky. Pokud je počet nelezených záznamů v tabulce č.2 menší než počet předplacených vstupů u dané předplacenky bude výstupem dotazu číslo předplacenky (neboť právě tato předplacenka obsahuje minimálně jeden volný vstup a lze z ní čerpat), pokud je počet nalezených záznamů v tabulce č. 2 roven počtu předplacených vstupů dané předplacenky, pak pokračuj na další předplacenku. Pokud jsou všechny předplacenky v tabulce č.1 vyčerpané nebo žádné předplacenky nejsou v tabulce č.1 nalezeny bude počet předplacených vstupů roven nule.

V současné době pomocí algoritmu níže dokážu zjistit počet zbývajících vstupů ze všech permanentek, které ještě neexpirovali, ale nemám v něm vyřešeno zjištění ID předplacenky, ze které se má čerpat tj. ta na které jsou ještě volné vstupy a bude co nejdříve expirovat.

$zbyva=0;
$nalezeno_kredit = mysql_query("SELECT * FROM `tab.c.1` WHERE `datum_expirace` > now()");

if (mysql_num_rows($nalezeno_kredit)>0){
   while ($nalezeno_pole = mysql_fetch_array($nalezeno_kredit)):
   $pocet_jednotek=$nalezeno_pole["POCET_vstupu"];
   $nalezeno_debet = mysql_num_rows(mysql_query("SELECT * FROM `tab.c.2` WHERE `ID_predplacenky_cerpani` = '".$nalezeno_pole["ID_predplacenky"]."'"));
   $zbyva=$zbyva+($pocet_jednotek-$nalezeno_debet);
endwhile;
}

Prosím o radu či úpravu kódu, jak mám ID předplacenky zjistit, popř. prosím o optimalizaci dotazu MySQL, neboť nyní to řeším především přes PHP a možná by to šlo vyřešit i rychleji přímo přes MySQL dotaz. Předem děkuji
Kajman
Profil
SELECT t1.*,
       (SELECT Count(*)
        FROM   `tab.c.2` t2
        WHERE  t2.`ID_predplacenky_cerpani` = t1.`ID_predplacenky`) cerpani
FROM   `tab.c.1` t1
WHERE  t1.`datum_expirace` >= '2010-04-23'  

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: