Nou is het zo dat als ik een bestelling plaats dat hij moet kijken of er nog ruimte is op de tijd dat ik op geef. stel ik geef op dat begintijd 387 en eindtijd is 416 en printersid is 1. De query zou 1 resultaat terug moeten geven maar dat doet hij niet.
Mijn query ziet er als volgt uit:
SELECT *
FROM Printopdracht
WHERE Printopdracht.begintijd >= 387
AND Printopdracht.eindtijd <= 416
AND Printopdracht.printersid = 1
ORDER BY Printopdracht.begintijd
das toch logisch dat je niets terugkrijgt. Er is maar 1 printer met ID 1.
Bovendien heeft die een starttijd kleiner dan wat je opgeeft, dus die wordt niet geselecteerd.
@MiST er zijn 2 opdrachten met printersid 1.
Tweede opmerking heb je gelijk in.
Maar als ik OR gebruik in Printopdracht.eindtijd <= 416 dan werkt hij nog steeds niet.
begintijd >= 387 geeft 1 resultaat, alleen het tweede record voldoet aan deze eis. De eindtijd is echter 485 terwijl je query als eis stelt dat deze kleiner of gelijk aan 416 moet zijn. Dat geeft dus 0 resultaten.
Als jij OR zet voor de eindtijd komen de laatste twee records als resultaat, maar door de printersid = 1 eis, worden deze niet weergegeven.
Ik weet even niet meer hoe SQL zijn prioriteiten afhandeld. Het kan zijn dat hij die OR eindtijd AND printerid samenvoegd, dit verklaard de 0 resultaten. Probeer het volgende eens. (Zie haakjes bij de WHERE clause)
SELECT *
FROM Printopdracht
WHERE (Printopdracht.begintijd >= 387
OR Printopdracht.eindtijd <= 416)
AND Printopdracht.printersid = 1
ORDER BY Printopdracht.begintijd
nog wil ik een nieuwe toevoegen met de volgende waardes, (1, 3, 507, 536) ik krijg vervolgens al de 2 de records terug. omdat ze voldoen aan de query, want die is als volgt.
SELECT *
FROM Printopdracht
WHERE (Printopdracht.begintijd >= 507
OR Printopdracht.eindtijd <= 536)
AND Printopdracht.printersid = 1
ORDER BY Printopdracht.begintijd
SELECT*
FROM Printopdracht
WHERE(Printopdracht.begintijd >=507
OR Printopdracht.eindtijd <=536)
AND Printopdracht.printersid =1
ORDERBY Printopdracht.begintijd
Het is de bedoeling dat ik alleen de record terug krijg met de volgende waardes (1, 2, 499, 514) want die staat er al en mijn nieuwe record valt er tussen in. Als hij deze heeft moet hij de eindtijd nemen van de gevonden record en gebruiken als nieuwe begintijd dus dan wordt de nieuwe record dit (1, 3, 514, 543) deze gaat vervolgens door dezelfde functie en zal geen record terug krijgen en kan dan dus geplaatst worden.
Ok ik snap wat je wil. De volgende query doet volgens mij wat je wil (ik heb hem niet getest verder, dit is wat ik denk dat moet werken). Je wil dus alle records waarbij je nieuwe begintijd tussen een bestaande begin EN eindtijd valt, OF waarbij je nieuwe eindtijd tussen een bestaande begin EN eindtijd valt.
SELECT *
FROM Printopdracht P
WHERE (P.begintijd >= 507 AND P.eindtijd <= 536) OR
(P.begintijd <= 507 AND P.eindtijd >= 536)
SELECT*
FROM Printopdracht P
WHERE(P.begintijd >=507AND P.eindtijd <=536)OR
(P.begintijd <=507AND P.eindtijd >=536)
Hmm, dit werkt voor het specifieke geval wel, maar wanneer een nieuwe opracht half overlappend is ook weer niet. Volgens mij is de oplossing heel simpel maar ik kan het even niet concreet voor me krijgen.
@eXpor heb je query geprobeert maar krijg geen record terug.
Citaat:
Hmm, dit werkt voor het specifieke geval wel, maar wanneer een nieuwe opdracht half overlappend is ook weer niet. Volgens mij is de oplossing heel simpel maar ik kan het even niet concreet voor me krijgen.
Je hebt helemaal gelijk, ik zelf krijg het ook niet concreet vandaar dit bericht . EN dat overlappende gedeelte is juist het probleem.
Ok ik heb er nog even over nagedacht, wat ik eerder had geschreven klopte, alleen mijn query deed iets anders dan ik omschreef. Deze query doet wel wat ik zei.
SELECT *
FROM Printopdracht P
WHERE (P.begintijd <= 507 AND P.eindtijd >= 507) OR
(P.begintijd <= 536 AND P.eindtijd >= 536)
ORDER BY P.eindtijd DESC
LIMIT 0,1
SELECT*
FROM Printopdracht P
WHERE(P.begintijd <=507AND P.eindtijd >=507)OR
(P.begintijd <=536AND P.eindtijd >=536)
ORDERBY P.eindtijd DESC
LIMIT0,1
Als je nou een opdracht inpland over 2 bestaande opdrachten krijg je maar 1 record terug, degene met de hoogste eindtijd, die andere doet er dan toch niet toe (volgens mij).
SELECT *
FROM Printopdracht P
WHERE P.printersid = 1 AND
((P.begintijd <= 507 AND P.eindtijd >= 507) OR
(P.begintijd <= 536 AND P.eindtijd >= 536))
ORDER BY P.eindtijd DESC
LIMIT 0,1
thanks ik ga het even testen en dan laat ik je het weten.
Ik heb het getest alleen werkt nog niet helemaal goed. want de eerste keer krijg ik die ene record terug dat is goed alleen dan gaat hij nog eens door die functie heen omdat hij een nieuwe begintijd en eindtijd heeft namelijk de begintijd word de gevonden records eindtijd en de nieuwe eindtijd is begintijd + 29(duur van opdracht). Als ik die dan uitvoer krijg ik weer de eerste record terug.
Kan je de exacte query geven die hij de 2e keer uitvoerd? Btw als je nieuwe begintijd de eindtijd wordt dan komt hij idd nog steeds terug. De query zoekt namelijk eindtijden die GELIJK of lager zijn (in dit geval). De nieuwe begintijd moet de gevonden eindtijd + 1 zijn (lijkt mij), en als dat niet de bedoeling is, moet je de query aanpassen dat er bij eind (en/of begin) tijden alleen naar grotere/kleinere waarden wordt gekeken en niet naar waarden de gelijk zijn.
SELECT *
FROM Printopdracht P
WHERE P.printersid = 1 AND
((P.begintijd <= 514 AND P.eindtijd >= 514) OR
(P.begintijd <= 543 AND P.eindtijd >= 543))
ORDER BY P.eindtijd DESC
LIMIT 0,1
SELECT*
FROM Printopdracht P
WHERE P.printersid =1AND
((P.begintijd <=514AND P.eindtijd >=514)OR
(P.begintijd <=543AND P.eindtijd >=543))
ORDERBY P.eindtijd DESC
LIMIT0,1
Hij moet kijken naar records groter/kleiner dan dus dat heb ik al aangepast. Alleen dan geeft hij een andere record dat is in principe mogelijk alleen deze record heeft als printersid 5 en dat mag niet hij moet alleen degene met printersid 1
Als dat de exacte query is die wordt uitgevoerd (inclusief de dubbele(!!) haken om de tijd vergelijking) heb ik geen flauw idee hoe hij daar een opdracht van printersid 5 kan terug krijgen. Hij selecteert eerst alle printersid = 1 en gaat daarna pas tijden filteren. Dus kijk even of je idd de EXACTE query gebruikt zoals ik hem heb gegeven (op de groter/kleiner vergelijking na). Als dit het geval is dan heb ik echt geen idee waarom het niet werkt, helaas.