login  Naam:   Wachtwoord: 
Registreer je!
 Forum

query result niet gewenst (Opgelost)

Offline Tuinman - 17/06/2010 08:48
Avatar van TuinmanNieuw lid Ey allemaal,

Ik ben een query aan het schrijven alleen het resultaat dat ik terug krijg klopt niet met wat is wil.
Ik heb de volgende data in een tabel staan.
  1. (`printersid`, `bestellingenid`, `begintijd`, `eindtijd`)
  2. (5, 1, 360, 435),
  3. (1, 1, 435, 485),
  4. (7, 2, 360, 379),
  5. (1, 2, 379, 394);


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:

  1. SELECT *
  2. FROM Printopdracht
  3. WHERE Printopdracht.begintijd >= 387
  4. AND Printopdracht.eindtijd <= 416
  5. AND Printopdracht.printersid = 1
  6. ORDER BY Printopdracht.begintijd


Kan iemand mij vertellen wat ik fout doe.

Greetz

17 antwoorden

Gesponsorde links
Offline MiST - 17/06/2010 09:45
Avatar van MiST Lid 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.
Offline Tuinman - 17/06/2010 09:52
Avatar van Tuinman Nieuw lid @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.

Greetz
Offline eXpor - 17/06/2010 10:48 (laatste wijziging 17/06/2010 11:39)
Avatar van eXpor Nieuw lid 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)

  1. SELECT *
  2. FROM Printopdracht
  3. WHERE (Printopdracht.begintijd >= 387
  4. OR Printopdracht.eindtijd <= 416)
  5. AND Printopdracht.printersid = 1
  6. ORDER BY Printopdracht.begintijd
Offline Jelmerholland - 17/06/2010 11:36
Avatar van Jelmerholland PHP beginner Tuinman, zet je haakjes om je OR heen?
dus:
//voorwaarden
(iets = x OR ietsanders = x)
//rest van je voorwaarden
Offline Tuinman - 17/06/2010 11:42
Avatar van Tuinman Nieuw lid Oke gaan we proberen, thx voor de reactie
Offline MiST - 17/06/2010 12:18
Avatar van MiST Lid
Tuinman schreef:
@MiST er zijn 2 opdrachten met printersid 1.


Auw, ben ik even blind zeg  
Offline Tuinman - 17/06/2010 12:42
Avatar van Tuinman Nieuw lid @eXpor ik heb de syntax geprobeerd maar krijg telkens de zelfde records terug.

nogmaals een voorbeeld dit zijn de records uit table:
  1. (`printersid`, `bestellingenid`, `begintijd`, `eindtijd`)
  2. (1, 1, 555, 605),
  3. (1, 2, 499, 514);


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.

  1. SELECT *
  2. FROM Printopdracht
  3. WHERE (Printopdracht.begintijd >= 507
  4. OR Printopdracht.eindtijd <= 536)
  5. AND Printopdracht.printersid = 1
  6. ORDER BY 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.

Hopelijk heb ik het wat duidelijker gemaakt.

Greetz
Offline eXpor - 17/06/2010 13:31 (laatste wijziging 17/06/2010 13:34)
Avatar van eXpor Nieuw lid 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.

  1. SELECT *
  2. FROM Printopdracht P
  3. WHERE (P.begintijd >= 507 AND P.eindtijd <= 536) OR
  4. (P.begintijd <= 507 AND 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.
Offline Tuinman - 17/06/2010 13:36 (laatste wijziging 17/06/2010 13:40)
Avatar van Tuinman Nieuw lid @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.

Greetz
Offline eXpor - 17/06/2010 13:45 (laatste wijziging 17/06/2010 13:55)
Avatar van eXpor Nieuw lid 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.

  1. SELECT *
  2. FROM Printopdracht P
  3. WHERE (P.begintijd <= 507 AND P.eindtijd >= 507) OR
  4. (P.begintijd <= 536 AND P.eindtijd >= 536)
  5. ORDER BY P.eindtijd DESC
  6. LIMIT 0,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).
Offline Tuinman - 17/06/2010 13:57 (laatste wijziging 17/06/2010 13:58)
Avatar van Tuinman Nieuw lid @eXpor hij werkt bijna helemaal goed alleen laat hij nog een opdracht zien met een ander printersid heb namelijk de volgende gegevens in table staan.

  1. (`printersid`, `bestellingenid`, `begintijd`, `eindtijd`)
  2. (5, 1, 480, 555),
  3. (1, 1, 555, 605),
  4. (7, 2, 480, 499),
  5. (1, 2, 499, 514);


Enig idee hoe dat komt dat hij de gene laten zien met printersid 5??
Offline eXpor - 17/06/2010 14:00 (laatste wijziging 17/06/2010 14:00)
Avatar van eXpor Nieuw lid Sorry ik was vergeten die regel weer toe te voegen 

  1. SELECT *
  2. FROM Printopdracht P
  3. WHERE P.printersid = 1 AND
  4. ((P.begintijd <= 507 AND P.eindtijd >= 507) OR
  5. (P.begintijd <= 536 AND P.eindtijd >= 536))
  6. ORDER BY P.eindtijd DESC
  7. LIMIT 0,1
Offline Tuinman - 17/06/2010 14:03 (laatste wijziging 17/06/2010 14:07)
Avatar van Tuinman Nieuw lid @eXpor
Citaat:
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.

Greetz
Offline eXpor - 17/06/2010 14:12
Avatar van eXpor Nieuw lid 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.
Offline Tuinman - 17/06/2010 14:20
Avatar van Tuinman Nieuw lid @eXpor de nieuwe query ziet er als volgt uit:
  1. SELECT *
  2. FROM Printopdracht P
  3. WHERE P.printersid = 1 AND
  4. ((P.begintijd <= 514 AND P.eindtijd >= 514) OR
  5. (P.begintijd <= 543 AND P.eindtijd >= 543))
  6. ORDER BY P.eindtijd DESC
  7. LIMIT 0,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
Offline eXpor - 17/06/2010 14:28 (laatste wijziging 17/06/2010 14:28)
Avatar van eXpor Nieuw lid 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.
Bedankt door: Tuinman
Offline Tuinman - 17/06/2010 14:31
Avatar van Tuinman Nieuw lid @eXpor je bent mijn held, het werkt heb query na gekeken en was de dubbele (( vergeten, thanks  

Greetz
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.184s