Keresés

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

  • nyunyu

    félisten

    válasz pch #5547 üzenetére

    Sokadik olvasatra sikerült megfejtenem, mit is akart jelenteni ez a sor:
    AND rendeles_id NOT IN (SELECT IFNULL(rendeles_tmp,0) FROM user)

    Ha jól értem, amíg a felhasználó nyitott egy tranzakciót, akkor az user tábla rendeles_tmp oszlopba íródik be a félkész rendelés ID-je, és ott is marad, amíg be nem fejezi a vásárlást.
    (Remélem egy másik "trigger" takarítja a szemetet utána!
    Bár én azt nem triggerre bíznám, hanem explicite kiadnám a delete-et a program kódban.
    Ha ilyenekre triggereket használtok, ott valami nagyon félrement az alkalmazás tervezésekor/implementálásakor.)

    Ekkor viszont a querym végére ezt egy WHERE-be kéne írni:
    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)
    WHERE T1.rendeles_id NOT IN (SELECT rendeles_tmp FROM user);

    IFNULL(rendeles_tmp,0): ezt meg eleve nem értem, miért kell a null értékeket nullára konvertálni?
    Ki nem töltött érték/null az nem része a halmaznak (IN), de az ellenkezőjének sem (NOT IN).

    (Java programozóink szoktak vért izzadni, mert a DBben a null is értelmes érték.
    Azt jelenti, hogy nincs adat. :DDD)

  • nyunyu

    félisten

    válasz pch #5547 üzenetére

    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