Keresés

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

  • Apollo17hu

    őstag

    válasz szmegma #1347 üzenetére

    Gondolkodtam, hogyan kellene továbbhaladni. Lehet, hogy túlbonyolítom, de 2 halmazt (lekérdezést) kellene alkotni. Az eddigiekhez képest módosítani kell a meglévő lekérdezésen, lejjebb írom, hogyan:

    1. azon munkások, akik munkaidején belülre esik a vizsgálandó időintervallum
    2. minden munkás minden munkavégzését minősíteni aszerint, hogy üti-e a vizsgált intervallumot -> ["oszlop"]

    Az elsőnek vhogy így kell kinéznie:

    SELECT DISTINCT workers_id
    FROM ...
    WHERE munkaido_start < checking_start AND munkaido_end > checking_end

    Ez csak a munkások azonosítóit adja vissza, semmi mást, és másra nincs is szükség.

    A második pedig az eddig megírt lekérdezésed módosítása. Annyit kell átírnod benne, hogy a WHERE -ből kitörlöd az eddigi szűréseket, helyette pedig beírod a CASE WHEN tartalmát (és így egyúttal az ["oszlop"] segédoszlopot ki is törölheted). Tehát így:

    SELECT DISTINCT workers_id
    FROM ...
    WHERE munkafolyamat_start < checking_tart AND munkafolyamat_end > checking_end

    Ez csak azokat a munkásokat listázza, akik már foglaltak a vizsgált intervallumot tekintve.

    Ha sikerült előállítani a fenti két lekérdezést, akkor LEFT (vagy RIGHT) JOIN-nal kösd össze őket! Az 1. halmazból "kivonva" a 2. halmazt azokat a munkásokat kapod, akik ráérnek a vizsgált időpontban.

    Így:

    SELECT munkaideje_megfelel.workers_id
    FROM (első lekérdezés kódja) AS munkaideje_megfelel
    LEFT JOIN (második lekérdezés kódja) AS munkafolyamatat_uti
    ON munkaideje_megfelel.workers_id = munkafolyamatat_uti.workers_id
    WHERE munkafolyamatat_uti.workers_id IS NULL

    A JOIN-okban nem vagyok biztos, én más szintaktikát szoktam használni, de a lényeg sztem látszik.

    Ha ez kész, akkor írom, hogyan csapd a workers_id mellé a szükséges infót (de erre már te is rá tudsz jönni).

  • Apollo17hu

    őstag

    válasz szmegma #1347 üzenetére

    Ha jol ertem, akkor ez mar CSAK ["oszlop"]=>"true" erteku munkast dob vissza? Magyarul aki biztos nem er ra.

    Nem, ["oszlop"] értéke lehet "false" is, ami azt jelenti, hogy a munkásnak ez a munkája nem ütközne abba a munkába, amit rá akarunk sózni. Viszont a munkásnak több munkája is van, és ha csak egynél is "true" értéket kapsz, az fogja azt jelenteni, hogy a munkásnak van olyan munkája, ami üti a rásózandó melót. De át is írhatod a "true" és a "false" értékeket pl. "not feasible" és NULL -ra vagy bármire, hogy hangsúlyosabban látszódjon.

    Idokozben kiderult itt egy ujabb dolog. Megpedig, hogy nem csak egyetlen idopontot kell vizsgalnia a keresnek, hanem ido intervallumot.

    Ezt úgy kellene megoldani, hogy az intervallum kezdetét és végét tárolod. Tehát mondjuk checking_start és checking_end meződ van. Az ["oszlop"] meződet kell csak módosítanod (ennek is adhatnál mondjuk egy ["check_worker_time"] vagy bármilyen, beszédes nevet) úgy, hogy a checking_start -ot a workers_start_hour -hoz, a checking_end -et pedig a workers_end_hour -hoz viszonyítod.

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