Autor Zpráva
MilanKarkulka
Profil
**mám tabulku, kde jsou uloženy zakázky (momentálně 3600 zakázek)**

ID | ZAKÁZKA
1 | Pepsi tvarování lahví
2 | Coca Cola návrh logo
3 | Sprite rozvoz zboží


**pokud během dne udělám nějakou práci na zakázce, tak si mi do jiné tabulky o tom uloží záznam (momentálně 15 000 záznamů)**

ID | ZÁKAZNÍK | PRÁCE | DÉLKA PRÁCE
1 | 2 | práce pro coca colu | 123123123
2 | 1 | práce pro pepsi | 142342343
3 | 3 | práce pro sprite | 134124312

Chci se podívat, na jakých zakázkách jsem tento měsíc pracoval:

Jednoduše - beru jednu zakázku za druhou a dívám se, jestli mám v druhé tabulce pro ni nějaký záznam o provedené práci.

$query=mysql_query("SELECT * FROM zakazky");
    while ($get=mysql_fetch_array($query))
    {
    $nazevzakazky = $get['nazevzakazky'];
    $idcko=$get['idcko'];
        

        $aaa=mysql_query("SELECT * FROM provedeneprace WHERE zamestnanec=$yyyuser AND zakazka=$idcko AND (den >=$startden AND den <=$endden)");
        while ($bbb=mysql_fetch_array($aaa))
        {
        $delkaprace=$delkaprace+$bbb["delkaprace"];
        }

        echo "Na zakazce $nazevzakazky jsi tento mesic udelal $delkaprace";

    }

Tento můj způsob ovšem trvá 32 sekund... . Nevím, jak lépe bych to mohl řešit?
Kcko
Profil
Ano, nastav tabulkám indexy na příslušné sloupce a tabulky spoj jedním dotazem přes JOIN
Ty to vypisuješ všechno najednou? Nastav tomu taky nějaké stránkování nebo ještě lépe, detaily o práci vypisuj až v detailu zakázky.
Ukládat do DB timestamp je většinou na nic; používej sloupce k tomu určené (DATE|DATIME|TIME).

A určitě by se hodil nějaký DB layer než tyhle nativní funkce (navíc rodina mysql je už za chvíli mrtvá).
Celkově ten kód je příšerný i konvence pojmenování proměnných.
MilanKarkulka
Profil
Vím co znamená JOIN v tabulkách, ale udělat jej neumím, protože nejsem primárně programátor.
Dokázal by jsi mi poradit, jak ten JOIN napsat pro tuto situaci?
Kcko
Profil
MilanKarkulka:
www.itnetwork.cz/mysql/mysql-tutorial-dotazy-pres-vice-tabulek
www.linuxsoft.cz/article.php?id_article=837

Jinak spojení provedeš přes tabulku zakazka.id , druha tabulka .zakaznik (opět pojmenované nekonzistetně).
MilanKarkulka
Profil
Už mi to funguje:

    $query=mysql_query("SELECT cislozakazky, nazevzakazky, delkaprace, typprace, zamestnanec, den, id FROM zakazky INNER JOIN prace ON zakazka=idcko WHERE zamestnanec=$yyyuser ORDER by cislozakazky") or die(mysql_error());
    while($result=mysql_fetch_array($query)){
    
    $cislozakazky=$result["cislozakazky"];
    $nazevzakazky=$result["nazevzakazky"];
    $delkaprace=$result["delkaprace"];
    
    if($result["den"]>=$startden AND $result["den"]<=$endden){
        if($priznak!=$nazevzakazky AND $priznak!=""){
            echo "<tr>";
            echo "<td class=\"td\"><b>[$cislozakazky]</b> $priznak</td>";
            $yyywhile=1;
            while($yyywhile!=12){
            if($sklenik[$yyywhile]!=""){
                $H = floor($sklenik[$yyywhile] / 3600);
                $i = ($sklenik[$yyywhile] / 60) % 60;
                $H = sprintf("%02d", $H);
                $i = sprintf("%02d", $i);
                echo "<td>$H:$i</td>"; }else{ echo "<td>-</td>";  }
                $yyywhile++;
            }
            $H = floor(array_sum($sklenik) / 3600);
            $i = (array_sum($sklenik) / 60) % 60;
            $H = sprintf("%02d", $H);
            $i = sprintf("%02d", $i);
            $yyytotal=$yyytotal+array_sum($sklenik);
            echo "<td><b>$H:$i</b></td>";
            echo "</tr>";
            unset($sklenik);
        }
        
        $abcd = $sklenik[$result['typprace']];
        $sklenik[$result['typprace']]=$result['delkaprace']+$abcd;
        $priznak=$nazevzakazky;
    }

    

    }

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: