Selecteren van entries uit een tabel met restricties uit een andere tabel

  • Hallo iedereen!


    Ik ben weer bezig om de personeelsapp van onze afdeling te verbeteren. Dit wil ik gaan doen door een lijst te maken van medewerkers die op een geselecteerde dag vrij zijn, weer te geven. Het probleem is, dat de SQL structuur daar niet op gemaakt is, en dat ik niet weet met welke query ik dat op kan halen.


    De structuur ziet er als volgt uit:


    Tabel "employees"
    Hierin staan alle medewerkers.
    id int(150)
    name varchar(150)
    name_wh varchar(150)


    Tabel "working_hours"
    Hierin staan alle diensten.
    id int(250)
    employee int(150)
    date date
    code varchar(10)
    from time
    till time


    En de kolom employee uit de tabel employees staat dus gelijk aan het id uit de tabel working_hours.


    En de bedoeling is nu, om uit de tabel employees alle medewerkers te halen die in tabel working_hours op een gespecificeerde dag geen dienst (is gelijk aan entry in de tabel) hebben.


    Zelf dacht ik deze query, maar die geeft alle employees weer, ook die gewoon een dienst hebben op de aangegeven dag.

    SQL
    SELECT name FROM employees LEFT JOIN working_hours ON employees.id != working_hours.employee WHERE working_hours.date='2015-07-09'

    Alvast heel erg bedankt voor het meedenken!



    Groetjes,


    Lars

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Er moet natuurlijk wel een verband zijn tussen de twee tabellen (de employee id's moeten op een of andere manier overeenstemmen).


    Probeer het eens met (NOT) EXISTS:

    SQL
    SELECT e.name
    FROM employees e
    WHERE NOT EXISTS (
        SELECT w.id
        FROM working_hours w
        WHERE w.employee = e.id
        AND w.date = '2015-07-09'
    )

    Overigens, als je enkel opslaat wanneer iemand niet beschikbaar is zegt dat niets over wanneer iemand wel beschikbaar is.



    Als je bijvoorbeeld maar 4 dagen in de week werkt (ma-do) dan ben je morgen (vr) wel beschikbaar volgens deze query.



    Wordt iemand dan op zijn vrije dag ingeroosterd? :)


    Ik zou dus ook een soort van werktijden table verwachten, maar dan in de zin: wanneer is iemand beschikbaar (de tegenhanger van wanneer is iemand bezet - de working_hours tabel)



    En hier probeer je dus de beschikbaarheid te bepalen via een query, maar zou het niet veel intuïtiever zijn om e.e.a. visueel weer te geven in een soort van timetable / kalender waar (gekleurde) blokken in staan die reeds ingeroosterde uren weergeven? Dan is in één oogopslag duidelijk wie er niet op enig moment beschikbaar is.



    Oh en die "from" kolomnaam is niet heel erg handig gekozen, want dat is een gereserveerd woord :/.

  • dit kan je oplossen door `from` te doen

    Dit kun je ook voorkomen door een handigere naam te kiezen. Je zou ook kunnen gaat voor een variant waarbij je alle kolommen voorziet van een unieke prefix, bijvoorbeeld wh_from. In beide gevallen hoef je geen backticks te gebruiken.


    Tenzij je overal consequent backticks omheen zet (wat nogal bewerkelijk is en de query slechter leesbaar maakt) zou ik (alleen al) in het kader van uniformiteit (en tis gewoon verdomd onpraktisch) dit probleem gewoon op voorhand uit de weg gaan.


    Tevens: /offtopic

  • Mijn excuses voor deze late reactie! Ik was zo druk, dat ik geen tijd had om te programmeren, maar ben er zojuist weer mee verder gegaan en met behulp van FangorN is het me gelukt.


    Hartelijk dank!!


    Wat betreft de from kolomnaam, daar ben ik het mee eens, het is geen goede keuze voor een kolom.


    Bij ons kun je elke dag ingeroosterd worden, tenzij het je standaard dag vrij is, of je verlof voor aanvraagt. Echter, de app geeft gewoon het rooster weer wat in een ander programma gemaakt is. Deze functie is er om te kijken wie er niet werkt, om zo te kunnen kijken wie eventueel je dienst over kan nemen. Daarin hoeven verder vaste vrije dagen etc. niet in te worden meegenomen.


    Iedereen hartelijk dank voor het meedenken!!

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!