Új hozzászólás Aktív témák

  • nyunyu
    félisten

    Sziasztok!
    Having helyett mit lehetne (ha lehet) az alábbiak megvalósítására? (Illetve van egy subselect is)
    van egy rakat tábla, de csak a 3 fontosat említem
    rendelés tábla (rendelés id, meg a szokásos dolgok)
    tétel tábla (tétel_id, rendeles_id, kuldes_id, szamla_id)
    user tábla (user_id, usernev, rendeles_tmp)

    Ha valaki dolgozik akkor a rendelés id-t berakja az user tábla rendeles_tmp-be egy trigger.
    Kellene egy lista amibe azon a rendelések vannak amin akad még tennivaló.
    Ezt onnan tudjuk, hogy a kuldes vagy a szamla id a tételnél 0.

    Most kb ez a lekérdezés:
    SELECT T1.redeles_id,
    min(T2.kuldes_id) AS kuldes_min,
    min(T2.szamla_id) AS szamla_min
    FROM rendeles AS T1
    LEFT JOIN tetel AS T2 ON T1.rendeles_id=T2.rendeles_id
    AND rendeles_id NOT IN (SELECT IFNULL(rendeles_tmp,0) FROM user)
    GROUP BY T1.rendeles_id
    HAVING kuldes_min=0 AND szamla_min=0

    persze mint mondtam van még egy rakat tábla ami a fejléchez van joinolva, de azok nem lényegesek. Pl.: szállítási mód, fizetési mód stb.
    A rendelés 35690 bejegyzés míg a tétel 116984.
    A min és a having miatt kissé lomha a lekérdezés, azaz 1.22mp-et vár a kliens mire megkapja az adatokat.
    Kérdésem, hogy lehet-e valamennyit gyorsítani valahogy?
    Indexek természetesen vannak.

    Köszi!

    Juj.

    Először sorbarendezted+csoportosítottad a tételeket rendeles_id szerint, azután az ablakozós függvény a csoportokra külön-külön képezett egy eredményt, aztán az eredményhalmazt még egyszer átfésülted a having után írt feltételekkel?

    Nem lenne egyszerűbb egy sima joinnal eleve azokra a tételekre szűrni, ahol a kuldes_id vagy szamla_id null?

    SELECT DISTINCT T1.rendeles_id
    FROM rendeles AS T1
    JOIN tetel AS T2
    ON T1.rendeles_id=T2.rendeles_id
    AND (T2.kuldes_id IS NULL
    OR T2.szamla_id IS NULL);

    Distinctet csak azért tettem bele, hogy a több hiányos tétellel rendelkező rendelések csak egyszer szerepeljenek a listában, anélkül annyiszor kapnád vissza az azonosítóját, ahány tétele rossz.

    Így csak egyszer fog végigmenni a táblákon *, majd az eredmény sorbarendezése után kihagyja a duplikációkat.

    * vagy azon se, ha a tetel tablan van egy összetett index a rendeles_id, szamla_id, kuldes_id trióra.

Új hozzászólás Aktív témák