MySQL: Wie funktionieren JOINs?

Karbrüggen

Grünschnabel
Hallo,

ich habe ein Problem mit einer MySQL-Abfrage: und zwar komme ich nicht mit JOINs zurecht. Mein Englisch ist auch nicht so gut, dass ich die Dev-Seiten bei mysql.com vernünftig erfassen könnte... Aber vielleicht könnt ihr mir helfen.

Ich habe diese beiden Tabellen angelegt:
SQL:
CREATE TABLE `bestand` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `typ` enum('Buch','Heft/Magazin','CD','Kassette','Spiel','Sonstiges') collate latin1_general_ci NOT NULL default 'Sonstiges',
  `titel` varchar(255) collate latin1_general_ci NOT NULL,
  `autor` varchar(255) collate latin1_general_ci default NULL,
  `text` text collate latin1_general_ci,
  `genre` varchar(255) collate latin1_general_ci default NULL,
  `ausgeliehen` enum('ja','nein') collate latin1_general_ci NOT NULL default 'nein',
  `ausgeliehen_an` smallint(5) unsigned default '0',
  `rueckgabe` date default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

und

SQL:
CREATE TABLE `bewohner` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `name` varchar(255) collate latin1_general_ci NOT NULL,
  `wohnbereich` varchar(255) collate latin1_general_ci NOT NULL,
  `ausleihdauer` tinyint(3) unsigned NOT NULL default '14',
  `bemerkungen` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Zweck ist eine kleine Büchereiverwaltung für unsere Bibliothek (bzw. die meiner Zivildienststelle)...

Hierbei sollen `bestand`.`ausgeliehen_an` und `bewohner`.`id` miteinander in Verbindung gebracht werden, und am Ende eine Liste mit ausgeliehen Büchern/CDs/... mit Titel/Autor und eben dem Namen dessen, der es sich ausgeliehen hat, ausgegeben werden. Meine bisherige Lösung dafür sieht so aus:
  1. ausgeliehene Einträge mit bestand.ausgeliehen='ja' holen
  2. bestand.ausgeliehen_an herausfiltern
  3. bewohner.id und bewohner.name abfragen
  4. bestand.ausgeliehen_an und bewohner.id verknüpfen, mit bewohner.name verbinden
  5. Daten ausgeben

Wirklich schön ist das nun nicht (performant schon gar nicht, dafür aber fehleranfällig), darum möchte ich mich nun mit JOINs beschäftigen. Nur: Davon hab ich keine Ahnung. Ergooglete Tutorials waren meist auf englisch, bzw. dt.-sprachige nicht sonderlich ergiebig. Gibt es hier jemanden, der mir so einen JOIN erläutern kann?

Vielen Dank
Dominik


Eben hab ich hier im Forum was von OUTER bzw. INNER JOINs gelesen - wo liegt dabei der Unterschied zum normalen JOIN?
 
Hay und guten Tag,
es gibt ein Buch welches ich dir empfehlen würde es kommtvon O'Reilly und heißt Einführung in SQL ISB 3-89721-443-1 Kostet 29,90 und ist in DEUTSCH


Hier hast du ein eigenes Kapitel über Joins
 
Wenn man sich deine Tabelle so anschaut, ist "ausgeliehen_an" der Fremdschlüssel von "id" der Tabelle Bewohner. "id" ist dort der Primärschlüssel.

JOINs basieren auf dem Prinzip der Verknüpfung eines Fremdschlüssels mit einem Primärschlüssel. Vorraussetzung ist, dass der Fremdschlüssel in der anderen Tabelle al Primärschlüssel existiert. Manche Datenbanken prüfen dies automatisch immer nach und melden Fehler, wenn dies nicht so ist (Oracle, MySQL mit InnoDB, MS SQL Server, ...). Im MySQL Standard (MyISAM) muss man dies selber prüfen. Sind die Daten ok, kannst du den JOIN zum beispiel so gestalten:
SQL:
SELECT bestand.titel, bewohner.name FROM bestand INNER JOIN bewohner ON bestand.ausgeliehen_an = bewohner.id WHERE ausgeliehen = 'ja';
Alles weitere zu JOINs sollte eigentlich auch das Handbuch zu der entsprechenden DB :)



Gruß Radhad
 
Hay und guten Tag,
es gibt ein Buch welches ich dir empfehlen würde es kommtvon O'Reilly und heißt Einführung in SQL ISB 3-89721-443-1 Kostet 29,90 und ist in DEUTSCH


Hier hast du ein eigenes Kapitel über Joins

Danke, das werde ich mir mal anschuen!

Hallo,

besuch doch einfach die deutsche Seite von mysql.

http://www.mysql.de/

Auf der Seite http://dev.mysql.com/doc/refman/5.1/de/join.html findest du die Antworten zu deinen Fragen.

Die Referenz von mysql.de ist die selbe von mysql.com: dev.mysql.com ;-) Dass es aber eine offizielle dt. JOIN-Referenz gibt hatte ich nicht gesehen (ich hatte mich glaube ich zu sehr auf v5.0 beschränkt... ;-))

Wenn man sich deine Tabelle so anschaut, ist "ausgeliehen_an" der Fremdschlüssel von "id" der Tabelle Bewohner. "id" ist dort der Primärschlüssel.

JOINs basieren auf dem Prinzip der Verknüpfung eines Fremdschlüssels mit einem Primärschlüssel. Vorraussetzung ist, dass der Fremdschlüssel in der anderen Tabelle al Primärschlüssel existiert. Manche Datenbanken prüfen dies automatisch immer nach und melden Fehler, wenn dies nicht so ist (Oracle, MySQL mit InnoDB, MS SQL Server, ...). Im MySQL Standard (MyISAM) muss man dies selber prüfen. Sind die Daten ok, kannst du den JOIN zum beispiel so gestalten:
sql Code:
  1. SELECT bestand.titel, bewohner.name FROM bestand INNER JOIN bewohner ON bestand.ausgeliehen_an = bewohner.id WHERE ausgeliehen = 'ja';

Alles weitere zu JOINs sollte eigentlich auch das Handbuch zu der entsprechenden DB :)



Gruß Radhad

Cool, danke. Das werde ich mal pobieren!

Mir hatt die Einführung in Joins von SELFHTML sehr geholfen. Aber um die ganze Sache zu festigen würde ich auch ein Buch empfehlen, das von O'Reilly sieht ganz gut aus.

Auch ist cool... *lesestoff* :-)

Vielen Dank schonmal an alle!

LG
Dominik
 
Zurück