[mysql] Tegenovergestelde resultaat

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 26-05 10:14
Ik heb een query die mensen uit een database plukt die op betreffende datum nog niet ingeroosterd in het systeem zijn, en die op die datum niet hebben aangegeven afwezig te zijn. Ik kom dan uit op het volgende:
code:
1
2
3
4
5
6
SELECT p.pID,p.sysname FROM PERSON as p
LEFT OUTER JOIN unavailable AS u ON p.pID=u.pID
LEFT OUTER JOIN does AS d ON p.pID=d.pID
LEFT OUTER JOIN JOB AS j ON j.jobID=d.jobID
WHERE DATE_FORMAT('2004-05-05 15:00','%Y-%m-%d') = j.date
OR DATE_FORMAT('2004-05-05 15:00','%Y-%m-%d') BETWEEN u.startdatetime AND u.enddatetime

Dit werkt prima, behalve dan het feit dat ie dus de mensen selecteert die WEL ingeroosterd zijn, of WEL aangegeven hebben die dag niet aanwezig te zijn. Hoe krijg je in MySQL nu het omgekeerde? Ik dacht het leuk met een subquery te doen, kent dat idiote ding niets in die geest. Concreet dus: ik wil de inhoud van de PERSON tabel, zonder de pIDs die uit de bovenstaande query tevoorschijnkomen.

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

• p.pID weghalen
• WHERE () != j.date
• OR () < start OR () > end

Oftewel; je query omdraaien dus. Ik denk dat je hier wel een eind mee zou moeten komen.. :)

[ Voor 14% gewijzigd door OkkE op 21-04-2004 16:37 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 26-05 10:14
Dat had ik uiteraard al geprobeerd, maar op de een of andere manier wil het niet helemaal lukken... ben nu mysql aan het upgraden want in de 4.x versie zitten wel een aantal handige dingen, nu even kijken of ik mn provider ook zover kan krijgen.

Logisch trouwens: als je 'm omdraait krijg je alle gejoinde regels waarin geld dat de dates niet overeenkomen... da's leuk en aardig, maar regels waar het dan WEL klopt komen alsnog uit de query. Het is de bedoeling dat het helemaal niet mag voorkomen, en dat bereik je niet wanneer je de query omdraait volgens mij.

[ Voor 40% gewijzigd door jsiegmund op 21-04-2004 16:57 ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik denk dat je zoiets zoekt:

code:
1
2
3
4
5
6
7
8
9
10
SELECT p.pID,p.sysname FROM PERSON as p
LEFT OUTER JOIN unavailable AS u
    ON (p.pID=u.pID AND DATE_FORMAT('2004-05-05 15:00','%Y-%m-%d') BETWEEN u.startdatetime AND u.enddatetime)
LEFT OUTER JOIN does AS d
    ON p.pID=d.pID
LEFT OUTER JOIN JOB AS j
    ON (j.jobID=d.jobID AND DATE_FORMAT('2004-05-05 15:00','%Y-%m-%d') = j.date)
WHERE (u.pID IS NULL)
AND (d.pID IS NULL)
AND (j.jobID IS NULL)

[ Voor 15% gewijzigd door cameodski op 21-04-2004 17:18 ]

Never underestimate the power of


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

OkkE schreef op 21 april 2004 @ 16:36:
• p.pID weghalen
• WHERE () != j.date
• OR () < start OR () > end

Oftewel; je query omdraaien dus. Ik denk dat je hier wel een eind mee zou moeten komen.. :)
Behalve dat je bij negatie van een OR niet weer een OR krijgt, maar de AND van de negaties van zijn beide operands:

WHERE (blaat) != j.date AND blaat NOT BETWEEN u.startdatetime AND u.enddatetime

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!