[mySQL] Probleem met query en lege tabel

Pagina: 1
Acties:
  • 167 views sinds 30-01-2008
  • Reageer

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Helaas moet ik er dan toch aan geloven.
Ik kom er niet meer uit :'(

Ik heb drie tabellen:
pt_poule { id, naam }
pt_team { id, naam, poule }
pt_wedstrijd { id, team }

Er zitten uiteraard nog meer velden in mijn tabellen maar die zijn voor dit probleem niet van belang :)

Wat ik wil:
Ik wil de id en de naam van pt_poule hebben van de poules die voldoen aan:
- er zitten 5 teams in
- er zijn nog geen wedstrijden voor de poule (dus geen records)

Mijn pogingen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT pt_poule.id, pt_poule.naam
FROM pt_poule, (

SELECT poule, count( poule ) AS aantal
FROM pt_team
GROUP BY poule
) AS temp, (

SELECT pt_team.poule
FROM pt_wedstrijd, pt_team
WHERE pt_wedstrijd.thuis = pt_team.id
) AS temp2
WHERE pt_poule.id = temp.poule
AND temp.aantal =5
AND NOT temp2.poule = pt_poule.id

Dit werkt prima als er records in de pt_wedstrijd tabel zitten.
Helaas is dit niet altijd het geval.
En als de pt_wedstrijd tabel leeg is dan geeft de bovenstaande query een lege recordset terug

Ik heb al geprobeerd om met een IF-statement te werken, en op null te controleren.
Maar dit mocht helaas niet baten. :'(

Misschien is het wel simpel en kijk ik ergens overheen.
Maar ik kom er echt even niet uit.
Ik hoop jullie wel ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Dus je wilt ook dat wanneer er _wel_ wedstrijden aan een poule/team gekoppeld zijn, deze _niet_ getoond hebben?

It's scientifically known, that base improves the tase of cheezes!


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
dip schreef op woensdag 10 mei 2006 @ 14:24:
Dus je wilt ook dat wanneer er _wel_ wedstrijden aan een poule/team gekoppeld zijn, deze _niet_ getoond hebben?
Inderdaad, als er wél wedstrijden zijn voor de teams in de poule.
Dan wil ik dat de poule níet wordt teruggegeven. :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Yuck, wat een query! Ik zie hier een autodidact hard at work. Ik zou zeggen, stop waar je nu mee bezig ben en volg als de wiedeweerga een tutorial sql. En let daarbij op belangrijke zaken als JOINS, want volgens mij kan deze query 10x makkelijker:

code:
1
2
3
4
5
6
7
8
9
10
11
SELECT pt_poule.id, pt_poule.naam, COUNT( pt_team.id)
FROM pt_poule
JOIN pt_team ON pt_team.poule = pt_poule.id
WHERE NOT EXISTS (
  SELECT pt_wedstrijd.id
  FROM pt_team t2, pt_wedstrijd
  WHERE t2.id = pt_wedstrijd.team
  AND t2.poule = pt_poule.id
)
GROUP BY pt_poule.id, pt_poule.naam
HAVING COUNT( pt_team.id) = 5


Uit het losse polsje, dus er kan nog iets fout aan zijn, maar volgens mij zou dit globaal moeten doen wat jij wil.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:46
subqueries.
code:
1
2
3
4
select id, naam
from poule
where id not in ( select wedstrijd.poule_id from wedstrijd ) 
and id in ( select team.poule_id from team group by poule_id having count(1) = 5 )

Zo iets.

https://fgheysels.github.io/


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
bigbeng schreef op woensdag 10 mei 2006 @ 14:27:
Yuck, wat een query! Ik zie hier een autodidact hard at work.
Hoe weet jij dat? :+
Ik zou zeggen, stop waar je nu mee bezig ben en volg als de wiedeweerga een tutorial sql. En let daarbij op belangrijke zaken als JOINS, want volgens mij kan deze query 10x makkelijker:
Nou ik moet zeggen dat ik al tig tutorials heb gevolgd, maar die gaan nooit verder dan de syntax en een simpel voorbeeld.
Ik weet best hoe joins en dergelijke werken, alleen om ze goed toe te passen in een probleem moet ik nog wat mee oefenen ;)
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT pt_poule.id, pt_poule.naam, COUNT( pt_team.id)
FROM pt_poule
JOIN pt_team ON pt_team.poule = pt_poule.id
WHERE NOT EXISTS (
  SELECT pt_wedstrijd.id
  FROM pt_team t2, pt_wedstrijd
  WHERE t2.id = pt_wedstrijd.team
  AND t2.poule = pt_poule.id
)
GROUP BY pt_poule.id, pt_poule.naam
HAVING COUNT( pt_team.id) = 5


Uit het losse polsje, dus er kan nog iets fout aan zijn, maar volgens mij zou dit globaal moeten doen wat jij wil.
Nou, wat mij betreft is je query geniaal.
Hij werkt als de brandweer :D
Bedankt man _/-\o_
whoami schreef op woensdag 10 mei 2006 @ 14:31:
subqueries.
code:
1
2
3
4
select id, naam
from poule
where id not in ( select wedstrijd.poule_id from wedstrijd ) 
and id in ( select team.poule_id from team group by poule_id having count(1) = 5 )

Zo iets.
Helaas, poule_id zit niet in de tabel wedstrijd :)
Dan was het inderdaad een stuk simpeler geweest ;)

Dit werkt wel:
SQL:
1
2
3
4
SELECT id, naam FROM pt_poule
WHERE id NOT
IN ( SELECT pt_team.poule FROM pt_wedstrijd, pt_team WHERE pt_wedstrijd.thuis = pt_team.id )
AND id IN ( SELECT pt_team.poule FROM pt_team GROUP BY poule HAVING count( 1 ) =5 )

Dat de query zo klein kan zijn :o

[ Voor 24% gewijzigd door Gonadan op 10-05-2006 14:38 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Mocht je erin geinteresseerd zijn, dan kan ik wel een aantal redenen geven waarom jouw oorspronkelijke query (die ook wel aan de praat te krijgen is) niet handig is bij veel databasesystemen:

Door een SELECT .. FROM op een subquery te doen, dwing je het dbms om een resultaat set (die van de subquery) volledig in het geheugen te lezen om daar vervolgens matching op te gaan toepassen. Hierbij wordt er dus geen gebruik meer gemaakt van indexen op tabellen en dit kan dus leiden tot enorme performance issues.
Bij jouw WK poule (gokje ;) ) zal het er allemaal ongetwijfeld niet toe doen, maar mocht je nog verder willen met databases, dan zou ik me in dat soort zaken toch eerst verdiepen voordat je aan de slag gaat.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
bigbeng schreef op woensdag 10 mei 2006 @ 14:46:
Mocht je erin geinteresseerd zijn, dan kan ik wel een aantal redenen geven waarom jouw oorspronkelijke query (die ook wel aan de praat te krijgen is) niet handig is bij veel databasesystemen:
Ben ik zeker :)
Door een SELECT .. FROM op een subquery te doen, dwing je het dbms om een resultaat set (die van de subquery) volledig in het geheugen te lezen om daar vervolgens matching op te gaan toepassen. Hierbij wordt er dus geen gebruik meer gemaakt van indexen op tabellen en dit kan dus leiden tot enorme performance issues.
Ja, wel logisch eigenlijk ;)
Maar waarom hoeft hij dat bij IN dan niet?
Gaat hij dan één voor één evalueren ofzo? :?
Bij jouw WK poule (gokje ;) ) zal het er allemaal ongetwijfeld niet toe doen, maar mocht je nog verder willen met databases, dan zou ik me in dat soort zaken toch eerst verdiepen voordat je aan de slag gaat.
Misgegokt ;)
Het is een groter toernooi, maar ongeveer 140 teams zullen m'n pc niet slopen ;)

Heb jij dan misschien een link naar een tutorial die dit soort dingen wél vertelt? :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Helaas, ik heb mijn kennis op de ouderwetse manier (spreek uit: school) opgedaan. Ook heb ik een boel van collega's geleerd. Je zou http://www.w3schools.com eens kunnen proberen. Daar wordt een substantieel deel van SQL in tutorial vorm aangeboden. Verder kun je eventueel in de FAQ wat vinden: Programming FAQ - SQL, dingen zoals boeken en wat uitleg over veelgebruikte constructies.

In elk geval veel succes met bouwen :)

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
bigbeng schreef op woensdag 10 mei 2006 @ 17:36:
Helaas, ik heb mijn kennis op de ouderwetse manier (spreek uit: school) opgedaan. Ook heb ik een boel van collega's geleerd. Je zou http://www.w3schools.com eens kunnen proberen. Daar wordt een substantieel deel van SQL in tutorial vorm aangeboden. Verder kun je eventueel in de FAQ wat vinden: Programming FAQ - SQL, dingen zoals boeken en wat uitleg over veelgebruikte constructies.

In elk geval veel succes met bouwen :)
Tsja, helaas heb jij dan meer geluk gehad met je onderwijs.
De lessen in SQL die ik gehad heb waren niet meer dan de syntax leren en een beetje kloten met deadlocks. :+

w3schools is zo'n beetje m'n startpagina en de FAQ ken ik ook :)
Hoe de functies werken weet ik wel.
Het probleem met mij is alleen dat ik ze nog automatisch moet oproepen in m'n bovenkamer als ik ze nodig heb ;)
Met Java en PHP weet ik precies wat ik nodig heb, met SQL denk ik nog niet zo automatisch, maar het gaat steeds beter. ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1