[SQL] Joins, veel joins

Pagina: 1
Acties:

  • Skaah
  • Registratie: Juni 2001
  • Niet online
Okay... ik heb een twee tabellen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Tabel kaarten:
+-----------------------+--------------+------+-----+---------+----------------+
| Field                 | Type         | Null | Key | Default | Extra          |
+-----------------------+--------------+------+-----+---------+----------------+
| kaart_id              | int(6)       |      | PRI | NULL    | auto_increment |
| kaar_naam             | varchar(255) |      |     |         |                |
| kaart_weakness        | int(6)       | YES  |     | NULL    |                |
| kaart_resistance      | int(6)       | YES  |     | NULL    |                |
+-----------------------+--------------+------+-----+---------+----------------+
Tabel klassen
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| klasse_id   | int(6)       |      | PRI | NULL    | auto_increment |
| klasse_name | varchar(255) |      |     |         |                |
+-------------+--------------+------+-----+---------+----------------+

De kolommen kaart_weakness en kaart_resistance wijzen beide naar een klasse_id, maar mogen ook null zijn. Maar hoe kun je de bijpassende klasse_name's vinden (of null)?

Een join op één veld lukt nog wel, maar een twee joins op dezelfde tabel gaat verkeerd (not unique)... Hoe moet deze tweaker dit aanpakken?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
2
3
SELECT * FROM Kaarten k
LEFT OUTER JOIN Klassen kl1 on k.kaartweakness = kl1.klasse_Id
LEFT OUTER JOIN Klassen kl2 on k.kaartresistance = kl2.klasse_Id


Als je dus vaker dan 1 x dezelfde tabel wilt gebruiken moet je hem een ander alias geven (wat ik hier heb gedaan met kl1 en kl2)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Tnx.
offtopic:
Moet je ondertitel niet:
Empty set (0.00 sec)
zijn? 0 row(s) affected is toch voor update / insert / delete statements?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Skaah schreef op 28 januari 2004 @ 15:10:
Tnx.
offtopic:
Moet je ondertitel niet:
Empty set (0.00 sec)
zijn? 0 row(s) affected is toch voor update / insert / delete statements?
offtopic:
Nope, niet voor SQL Server in ieder geval.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

P_de_B schreef op 28 januari 2004 @ 15:21:
[...]
offtopic:
Nope, niet voor SQL Server in ieder geval.
offtopic:
SQL Server geeft bij een select die een lege resultset oplevert anders echt alleen maar een lege resultset terug hoor, number of rows affected geeft idd afaik alleen bij wijzigingen oftewel insert/update/delete.

Professionele website nodig?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
curry684 schreef op 28 januari 2004 @ 16:21:
[...]

offtopic:
SQL Server geeft bij een select die een lege resultset oplevert anders echt alleen maar een lege resultset terug hoor, number of rows affected geeft idd afaik alleen bij wijzigingen oftewel insert/update/delete.
offtopic:
Nee hoor, niet als je via Query Analyzer een select doet.

SELECT * FROM sysobjects WHERE 1=2

Ik heb op deze PC geen QA, anders zou ik een screenshot posten :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

P_de_B schreef op 28 januari 2004 @ 18:54:
[...]


offtopic:
Nee hoor, niet als je via Query Analyzer een select doet.

SELECT * FROM sysobjects WHERE 1=2

Ik heb op deze PC geen QA, anders zou ik een screenshot posten :)
offtopic:
Hum ja je hebt gelijk... ik kijk normaal niet in de messages-tab na een select :P

Professionele website nodig?


  • Skaah
  • Registratie: Juni 2001
  • Niet online
offtopic:
Bij MySQL krijg je iig Empty Set.

misschien kan een modje al deze offtopic replies ff verwijderen? :P

  • TightHead
  • Registratie: April 2002
  • Laatst online: 07-11-2025
Ik denk dat je dit niet optimaal modelleert, want een kaart kent meer klassen en een klasse kan bij meer kaarten horen: een veel op veel of n op m relatie.

Je zou eigenlijk uit oogpunt van normalisering er een tabel tussen moeten zetten:

------- --------------------- ---------
kaart|--<- |klassetoewijzing|->--|klasse|
------- --------------------- ---------

en omdat kaart_weakness en kaart_resistance beide de klasserelatie(s) bepalen kun je deze overbrengen naar klassetoewijzing..wellicht handig bij updates en deletes :9

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
TightHead schreef op 28 januari 2004 @ 22:21:
Ik denk dat je dit niet optimaal modelleert, want een kaart kent meer klassen en een klasse kan bij meer kaarten horen: een veel op veel of n op m relatie.
Waar lees je dat? Daar heeft TS het niet over gehad.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • TightHead
  • Registratie: April 2002
  • Laatst online: 07-11-2025
P_de_B schreef op 29 januari 2004 @ 07:27:
[...]


Waar lees je dat? Daar heeft TS het niet over gehad.
Ik kijk gewoon naar wat er staat in termen van beschreven relaties. En daar staat dat er twee relaties zijn tussen de twee tabellen, vandaar ook de twee aliassen van jou om die join te maken. Ik zeg niet dat dit niet werkt, maar MySql doet alle moeite foreign keys in onder meer MyIsam als feature op te nemen

Note that for the moment only InnoDB tables support foreign keys. See section 14.4.5.2 FOREIGN KEY Constraints. Foreign key support in MyISAM tables is scheduled for implementation in MySQL 5.1.
van www.mysql.com/documentati...oduction.html#Constraints


en als je voornemens bent om je daaraan te conformeren ergens in de toekomst zul je een eenduidige relatie moeten leggen. Dat bedoelde ik te zeggen.

Maar..het hoeft allemaal niet, als het werkt dan werkt het met ad hoc tabellen ook wel en kun je net als in Access een beetje aanrotzooien en in je uppie iets met je tabellen doen. Ligt er maar aan hoe multi-user en hoe duurzaam je iets wilt maken..
Pagina: 1