Toon posts:

[SQL] Ingewikkeld SELECT statement

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb 2 tabellen in een MySQL database:

- Opdracht ( PERIODE, BEDRIJF, PRODUCT, AANTAL )
- Planning ( PERIODE, BEDRIJF, PRODUCT )

Ik moet alle records hebben uit Opdracht, waarvoor geld dat het aantal records in Planning (met die Periode, Bedrijf, Product) kleiner is dan het aantal vermeld in het veld uit het record in Opdracht.

Ik heb geen flauw idee hoe ik dit aan moet pakken, kan iemand mij op weg helpen.

[ Voor 3% gewijzigd door Verwijderd op 12-06-2003 14:22 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Heb je zelf al gezocht of iets geprobeerd? Is een niet al te ingewikkelde SQL-uitdaging....
Je topicstart is een beetje karig en lijkt nu wel heel erg op het type: "Dit heb ik, dit wil ik, ik hoor het wel als het af is"

[ Voor 55% gewijzigd door OZ-Gump op 12-06-2003 14:25 . Reden: leesfoutje ]

My personal website


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Ik moet alle records hebben uit Opdracht, waarvoor geld dat het aantal records in Planning (met die Periode, Bedrijf, Product) kleiner is dan het aantal vermeld in het veld uit het record in Opdracht.
Zo ingewikkeld is dat niet hoor. Met de tutorials over JOIN en COUNT() op http://www.w3schools.com moet je in ieder geval een eind komen

Veel succes :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Zoals het er nu uitziet zit er een berg redundante info in die db. De boel eens normalizeren zou de moeilijkheid van dit soort problemen sterk verminderen, maar in principe zou je mbv een count en enkele joins dit nog wel in 1 query kunnen doen. Hierbij ga ik er trouwens wel vanuit dat de combinate van periode, bedrijf en product uniek is in opdracht.

[ Voor 40% gewijzigd door Janoz op 12-06-2003 14:27 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Bepaal eerst het aantal record in de tabel Planning (=aantal_records) en query daarna de tabel opdracht als volgt:

SELECT * FROM Opdracht WHERE Opdracht.Aantal < [aantal_records]


[edit]

Tellen aantal records in tabel kan mbv Sum statement (tenminste in Access) waarbij het resultaat opslaat in een var, bv.

SELECT Sum(Planning.Product) AS aantal_records FROM Planning

[ Voor 37% gewijzigd door Verwijderd op 12-06-2003 14:28 ]


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Tellen aantal records in tabel kan mbv Sum statement (tenminste in Access) waarbij het resultaat opslaat in een var, bv.

SELECT Sum(Planning.Product) AS aantal_records FROM Planning
Hiervoor heb je de functie COUNT() nodig en niet de functie SUM() aangezien de laatste alleen de totale waarde weergeeft van de records in een bepaalde kolom ;)

Zie ook:
SQL Functions

[ Voor 11% gewijzigd door DeverauX op 12-06-2003 14:34 ]

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Sum vs. Count: true that! Even niet aangedacht, lamp ging branden toen ik je post las. Vraag is nl., snapt de grote vos het al?

Verwijderd

Topicstarter
Twee querys is geen optie, in beide tabellen staan nl zon 6000 records en dat worden er steeds meer, dus dan zou ik 6000 querys uit moeten voeren (MySQL kent geen subquerys).
Dat is ook gelijk mijn probleem. Ik zou het met ee nsubquery zo op kunnen lossen. Dit is echter niet mogelijk. Vandaar dat ik niet echt een oplossing heb.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 12 juni 2003 @ 14:36:
Twee querys is geen optie, in beide tabellen staan nl zon 6000 records en dat worden er steeds meer, dus dan zou ik 6000 querys uit moeten voeren (MySQL kent geen subquerys).
Dat is ook gelijk mijn probleem. Ik zou het met ee nsubquery zo op kunnen lossen. Dit is echter niet mogelijk. Vandaar dat ik niet echt een oplossing heb.
en met HAVING en COUNT is niks te doen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Is het dan niet verstandiger eens een keer serieus naar je databaseontwerp te kijken? Die is namelijk volgens mij ook niet echt optimaal, waardoor je nu tegen problemen aanloopt....?

My personal website


Verwijderd

Topicstarter
Nee, is inderdaad niet optimaal. Is gewoon kut. Probleem is dat het mijn database niet is. Tweede probleem is dat ik die database moet gebruiken.

En aan having heb ik ook niets, want dan moet ik alsnog een subquery uitvoeren op planning

[ Voor 25% gewijzigd door Verwijderd op 12-06-2003 14:46 ]


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Die is namelijk volgens mij ook niet echt optimaal,
En dat is dan nog zacht uitgedrukt... :)
Daarnaast zou ik de TS willen vragen wat deze zelf al geprobeerd heeft en waar je tegenaan bent gelopen.
Met de links die we je gegeven hebben moet je namelijk een eind komen en ik zie het probleem dan ook niet echt meer...

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Dan ben je in de spreekwoordelijke aap gelogeerd.... :+

Welke programmeeromgeving heb je er achter liggen, en is daar niet iets te doen met een loopje oid?

My personal website


Verwijderd

Topicstarter
Programmeeromgeving is (uiteraard) PHP. En een loopje is ook geen optie. Had ik namelijk ook eerst in gedachten, maar dat duurt een beetje lang (na 10 minuten werd ik het beu).
Ik snap alleen niet echt wat je bedoeld met die LEFT JOIN. Daar heb ik toch niets aan? Ik kan daar toch geen aantal records mee vergelijken

Verwijderd

Kun je hier nix mee?

SELECT Count(Planning.ID) AS CountOfID, Opdracht.Periode, Opdracht.Bedrijf, Opdracht.Product
FROM Opdracht INNER JOIN Planning ON Opdracht.ID = Planning.ID
GROUP BY Opdracht.Aantal, Opdracht.Periode, Opdracht.Bedrijf, Opdracht.Product
HAVING (((Opdracht.Aantal)<"CountOfID"));

Heb twee tabellen aangemaakt zoals jij ze hebt, maar inclusief primary keys en daarop een inner join gezet zodat de tabellen tegelijkertijd benaderd worden. Criteria is CountOfID.
Pagina: 1