dlouho trvající sql dotaz

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Zbynas 12. 1. 2022 14:02

Zdravím,

měl bych dvě prosby. Mám následující SQL dotaz, prvně je dosti pomalý (cca 2 sekundy), šlo by to nějak poladit? Lépe už jsem to neuměl.

A za druhé, potřebuji tam, co ej GROUP_CONCAT, aby to nějak joinulo i jména kurýrů jako v joinu nad tím, a vložilo k IDéčkám v tom concatu, abych nemusel mít zvlášť další dotaz jen na jména kurýrů ...

Díky ...

Kód: Vybrat vše
       $result3 = $db2->query("SELECT * FROM dt_mot_max_time");
       $sql_del = array();
       while ($r3 = $result3->fetch_array()){
       
            for ($i1=0;$i1<=1;$i1++){
                $timed = $r3['dt_mot_max_time'];
                if ($i1==1) $timed *= 2;
                $sql_del[] = "
                    WHEN
                    delivery.delivery_type_id='".$r3['delivery_type_id']."' AND
                    delivery.mot_id='".$r3['mot_id']."' AND
                    delivery.delivery_return='".$i1."'
                    THEN DATE_ADD(delivery_date_created, INTERVAL ".$timed." MINUTE)
                ";
            }
       }
        $sql_del_final = implode(" ",$sql_del);   
                         
        $result4 = $db2->query(" 
                SELECT *, @couriers = '', 
                (CASE 
                    ".$sql_del_final."
                END)  AS enddate           
                FROM delivery
            LEFT JOIN user ON delivery.user_id=user.user_id
            LEFT JOIN mot ON delivery.mot_id=mot.mot_id
            LEFT JOIN delivery_type
                   ON delivery.delivery_type_id=delivery_type.delivery_type_id
            LEFT JOIN (
                    SELECT courier_name AS courier_name, courier_id
                    FROM courier) courier1
                    ON delivery.courier1_id=courier1.courier_id
            LEFT JOIN (
                    SELECT courier_name AS courier_name2, courier_id
                    FROM courier) courier2
                    ON delivery.courier2_id=courier2.courier_id
            LEFT JOIN (
                    SELECT GROUP_CONCAT( IFNULL(courier_id,0)  SEPARATOR ',') AS couriers,
                    MAX(id) AS id8, delivery_id, id AS id7
                                FROM courier_interest 
                                GROUP BY delivery_id
                                ORDER by id DESC
                                LIMIT 200) interest
                                ON interest.delivery_id=delivery.delivery_id                         
         
            WHERE delivery_date_created<='$date1'
                ORDER BY
                    enddate DESC, delivery.delivery_id DESC
                LIMIT 30");
NVidia GTX 1060 6GB, Intel Core i7-2600K @ 3,4 GHz, 16 GB DDR 3
Download 100 Mbps, Upload 100 Mbps, ping 8
VINOTÉKA U FREJKA
FREJK.CZ, FREJK.SK, FREJK.COM
Zbynas
Junior
Uživatelský avatar

Odeslat příspěvekod Just_jo 12. 1. 2022 15:41

Předně - není to jeden dotaz - je to více dotazů v cyklu.
Dále - bez informací o struktuře tabulek to půjde těžko poladit.
Dále - není špatně navržena struktura tabulek?

Nešlo by to vyřešit mimo SQL - např. načtením řidičů do pole "ridici" atd. ?
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod Zbynas 13. 1. 2022 12:12

Pomalost SQL vyřešena ... stačílo definovat rozpětí, kde se má hledat:

Kód: Vybrat vše
WHERE (delivery_date_created>='$date1a' AND delivery_date_created<='$date1') or delivery_status='1'

Protože jsem přišel na to, že LIMIT nerozhledňuje počet prohledávaných dotazů.

Takže zbývá dotaz č. 2, jak do toho GROUP_CONCATu dostanu jménoa kurýrů, aby to vypadalo nějak takto:
ID|Jméno,ID|Jméno,ID|Jméno
To jméno z tabulky courier.

Jde to vyřešit dalším SQL dotazem, kde načtu jména kurýrů a hodím do polí ... Ale chtěl bych to mít pěkne v jednom dotazu ...



V tabulce "courier_interest" jsou dva sloupce. Delivery_id a Courier_id. Každá zásilka může mít více řádků v této tabulce, ale vždy s jiným kurýrem. To je seznam kurýrů, kteří se přes appku hlásí o zásilky. Já je zobrazím pomocí HTML SELECTu k přiřazení ve volném políčku místo jména kurýra (když zásilka není přidělená, je pole prázdné, jinak je tam kurýr)

scre.png
NVidia GTX 1060 6GB, Intel Core i7-2600K @ 3,4 GHz, 16 GB DDR 3
Download 100 Mbps, Upload 100 Mbps, ping 8
VINOTÉKA U FREJKA
FREJK.CZ, FREJK.SK, FREJK.COM
Zbynas
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků