[SQL] Join probleem van 2 tabellen

Pagina: 1
Acties:

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 04-08 13:44

Shift

[] Dual crazy []

Topicstarter
Hi

Ik heb een tabel die klassen heet zoals hier onder.

+--+----+
|id|klas|
+--+----+

En een andere tabel rooster zoals hieronder

+--+---+-------+----+----+-------+------+------+
|id|uur|docent|vak|klas|lokaal|tekst|datum|
+--+---+-------+----+----+-------+------+------+

IK wilde rooster tabel resultaten zien die niet de klassen bevatten die in tabel klassen zich bevind. Ik heb verschillende querys geprobeerd maar ik krijg niet de juiste output.

SELECT rooster. * , klassen.klas
FROM rooster
LEFT JOIN klassen ON klassen.klas = rooster.klas
WHERE klassen.klas IS NULL;

Als ik deze query probeer krijg ik in de zelfde resultaat natuurlijk 2 keer klas colommen, en daarom zijn die rows dan leeg omdat ze elkaar overschrijven.
Ik heb ook verschillende qwuerys geprobeerd maar lukt nog steeds niet.

select rooster.* from rooster,klassen where klassen.klas NOT IN (rooster.klas)

en

select rooster.* from rooster,klassen where rooster.klas != klassen.klas

en

select rooster.* FROM rooster LEFT JOIN klassen ON rooster.klas != klassen.klas

Heeft iemand een hint?

  • lytjepole
  • Registratie: September 2000
  • Laatst online: 01-08 21:14

lytjepole

Schier?

[Did you know... ... that 35% of statistics are made-up?]


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 04-08 13:44

Shift

[] Dual crazy []

Topicstarter
Heel errug bedankt, daar ben ik de hele dag aan het zoeken geweest. Als ik het daar gevonden had was ik hier niet!

  • lytjepole
  • Registratie: September 2000
  • Laatst online: 01-08 21:14

lytjepole

Schier?

Als je goed had gelezen was je er ook achter gekomen dat != niet echt sql is!
http://www.mysql.com/doc/en/Comparison_Operators.html

verder:
SELECT user,MAX(salary) AS sum FROM users
misschien?

[ Voor 17% gewijzigd door lytjepole op 27-08-2003 21:38 ]

[Did you know... ... that 35% of statistics are made-up?]


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 04-08 13:44

Shift

[] Dual crazy []

Topicstarter
Waar heb je over de query die jij geeft heeft totaal neits met mijn vraag mee te maken.
!= enof <> kan je wel gebruiken in je querys.

  • dvdhoek
  • Registratie: Februari 2002
  • Laatst online: 06-08 21:59
Allereerst, het gevraagde hier is in een normaal relationeel model nogal vreemd. Normaal gesproken zou de join namelijk moeten liggen via de ID variabele in klassen en niet via het veld klas. En als er een foreign key constraint ligt, komen alle klassen ALTIJD voor in de klassen tabel.
Als er geen foreign key is, wil je wellicht dit:
SELECT rooster. *
FROM rooster
LEFT JOIN klassen ON klassen.id = rooster.klas
WHERE klassen.id IS NULL

Als je DBMS geneste queries ondersteunt, kun je ook het volgende doen:
select rooster.* from rooster where klas NOT IN (select klas from klassen) of als het via ID gaat:
select rooster.* from rooster where klas NOT IN (select id from klassen)

  • bille
  • Registratie: Mei 2000
  • Laatst online: 05-08 23:45

bille

Don't call me Buff

als ik me niet vergis is er ook een operator NOT IN
probeer es zoiets als:
code:
1
Select * from Rooster where Rooster.klasID? NOT IN ( select klas.id from klas)


btw: als je jou datamodel voorlegt aan een leraar krijg je een -...

waarom gebruik je in je tabel Klassen en ID kolom als de klas al uniek is door de naam van de klas? De ID kolom is IMHO redundant.

[ Voor 38% gewijzigd door bille op 27-08-2003 21:53 ]

Ultra Pilammo 6666Mhz AMD, 4251Mbit/s RAM, Gefors V6666 MegaTurbo, 43" TFS, Ultra 80Gig Firewire netwerkkaart en 5D geluid met 66 speakers in 5 dimensies


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

!= is een operator die in mysql idd werkt.

Maar ik snap eerlijk gezegd je vraag niet zo goed, wat wens je precies te bereiken? Geef eens een voorbeeld dataset en wat je daar als resultaat uit probeert te halen?

Als MySQL subselects had ondersteund, dan zou je zoiets gewild hebben?
SELECT rooster.* FROM rooster WHERE rooster.klas NOT EXISTS (SELECT klas FROM klassen)
?

Een vieze manier in mysql is zoiets:
code:
1
2
SELECT rooster.* FROM rooster LEFT JOIN klassen ON rooster.klas = klassen.klas 
GROUP BY rooster.id HAVING COUNT(klassen.klas) = 0


Of de query van dvdhoek.

[ Voor 4% gewijzigd door ACM op 27-08-2003 21:53 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Wild guess... het is geen sql probleem. De eerstgenoemde query voldoet voor hetgeen je wilt weten. Als je (hier komt de guess) in php iets met het veld 'klas' wilt doen, krijg je een lege waarde omdat je in dezelfde recordset twee keer de kolom met de naam 'klas' hebt en je dan alleen de laatste kan ophalen met 'klas' in mysql_fetch_array. Is dat misschien je probleem?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • lytjepole
  • Registratie: September 2000
  • Laatst online: 01-08 21:14

lytjepole

Schier?

bigtree schreef op 27 August 2003 @ 21:54:
Wild guess... het is geen sql probleem. De eerstgenoemde query voldoet voor hetgeen je wilt weten. Als je (hier komt de guess) in php iets met het veld 'klas' wilt doen, krijg je een lege waarde omdat je in dezelfde recordset twee keer de kolom met de naam 'klas' hebt en je dan alleen de laatste kan ophalen met 'klas' in mysql_fetch_array. Is dat misschien je probleem?
daarom dacht ik aan:
select klassen.klas AS klas_1, rooster.klas AS klas 2

[Did you know... ... that 35% of statistics are made-up?]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

die klassen.klas moet NULL zijn (of eigenlijk, er mag geen join mogelijk zijn), wat heeft het voor nut die mee te selecteren dan :?

[ Voor 22% gewijzigd door ACM op 27-08-2003 21:58 ]


  • dvdhoek
  • Registratie: Februari 2002
  • Laatst online: 06-08 21:59
bille schreef op 27 August 2003 @ 21:50:


waarom gebruik je in je tabel Klassen en ID kolom als de klas al uniek is door de naam van de klas? De ID kolom is IMHO redundant.
Een ID kolom is niet verkeerd, maar dan moeten andere tabellen wel werken met dat ID en niet de klas naam gebruiken. Het is een goede gewoonte om ID kolommen te gebruiken, zeker als het gaat om (lange) character velden. Het scheelt namelijk nogal wat aan opslag en bovendien kun je dan een naam van een klas wijzigen, zonder dat je alle refererende tabellen hoeft aan te passen.

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 04-08 13:44

Shift

[] Dual crazy []

Topicstarter
ACM schreef op 27 August 2003 @ 21:51:
!= is een operator die in mysql idd werkt.

Maar ik snap eerlijk gezegd je vraag niet zo goed, wat wens je precies te bereiken? Geef eens een voorbeeld dataset en wat je daar als resultaat uit probeert te halen?

Als MySQL subselects had ondersteund, dan zou je zoiets gewild hebben?
SELECT rooster.* FROM rooster WHERE rooster.klas NOT EXISTS (SELECT klas FROM klassen)
?

Een vieze manier in mysql is zoiets:
code:
1
2
SELECT rooster.* FROM rooster LEFT JOIN klassen ON rooster.klas = klassen.klas 
GROUP BY rooster.id HAVING COUNT(klassen.klas) = 0


Of de query van dvdhoek.
Volgens mij heeft jou query het probleem opgelost, maar de vraag was, de tabel klassen bevat klassen :) de rooster tabel bevat ook een colom klas en andere informatie, de vraag was toon alle rijen uit rooster tabel waar de klas geen overeenkomst heeft met de klas in tabel klassen.
Ik denk dat jou query wel goed is, moet effe na kijken.

Het is inderdaad jammer dat mysql subselects ondersteunt, anders was het makkelijker :)

[ Voor 5% gewijzigd door Shift op 27-08-2003 22:02 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Nog een wild guess... je wilt de tabel 'klassen' vullen op basis van klassen die je de rooster-tabel tegenkomt? In dat geval is deze van het huis:
SQL:
1
INSERT INTO klassen (klas) SELECT DISTINCT(klas) FROM rooster

[ Voor 9% gewijzigd door bigtree op 27-08-2003 22:04 ]

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 04-08 13:44

Shift

[] Dual crazy []

Topicstarter
bigtree schreef op 27 August 2003 @ 22:03:
Nog een wild guess... je wilt de tabel 'klassen' vullen op basis van klassen die je de rooster-tabel tegenkomt? In dat geval is deze van het huis:
SQL:
1
INSERT INTO klassen (klas) SELECT DISTINCT(klas) FROM rooster
Nee dat is niet het geval maar toch bedankt :D
lytjepole schreef op 27 August 2003 @ 22:07:
soz, ik zat in de verkeerde richting te denken.

(zit er ook copyright op queries? : ) )
Copyright ?

[ Voor 24% gewijzigd door Shift op 27-08-2003 22:07 ]


  • lytjepole
  • Registratie: September 2000
  • Laatst online: 01-08 21:14

lytjepole

Schier?

soz, ik zat in de verkeerde richting te denken.

(zit er ook copyright op queries? : ) )

[Did you know... ... that 35% of statistics are made-up?]


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
2
3
SELECT *
FROM rooster
WHERE klas NOT IN (SELECT klas FROM klassen)
Pagina: 1