PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4 Tabellen joinen



deathb
25-04-2006, 19:46
Hi,

finde im Internet nichts um folgendes Problem zu lösen:

3 Tabellen werden zusammengefügt und eine Spalte durchsucht.
language, item_all_language, item
item ist der Gegenstand, language speichert Sprachen und item_all_language fügt es als n_m relation zusammen. Soweit funktioniert das auch.
Jetzt möchte ich eine weitere Spalte aus einer anderen Tabelle zur Ausgabe hinzufügen (FK in item), hier gibts ein Bild und die bisherige Abfrage:

home.pages.at/metalfan

Was würdet ihr an Literatur zu (My)SQL empfehlen?

Romanday
25-04-2006, 19:58
Hi,

finde im Internet nichts um folgendes Problem zu lösen:

3 Tabellen werden zusammengefügt und eine Spalte durchsucht.
language, item_all_language, item
item ist der Gegenstand, language speichert Sprachen und item_all_language fügt es als n_m relation zusammen. Soweit funktioniert das auch.
Jetzt möchte ich eine weitere Spalte aus einer anderen Tabelle zur Ausgabe hinzufügen (FK in item), hier gibts ein Bild und die bisherige Abfrage:

home.pages.at/metalfan

Was würdet ihr an Literatur zu (My)SQL empfehlen?

Das Thema Literatur wurde hier schon öfter diskutiert.

Dein Join Problem: Übe doch mal ein wenig den Umgang mit Joins.
Du wirst doch genügend Beispiele im Netz finden. Wenn du die
Philosophie eines Joins verstanden hast, ist die Anzahl der Tabellen
unwichtig. Wenn Du irgendwann einen Join über 5 Tabellen
brauchst fragst du wieder.!?

deathb
25-04-2006, 20:18
Für die Frage nach der Literatur kannst du mich haun, aber ich finde mit google einfach keine Beispiele zu meinem Problem.

Jasper
25-04-2006, 21:16
Für die Frage nach der Literatur kannst du mich haun, aber ich finde mit google einfach keine Beispiele zu meinem Problem.

google, joins+sql, 1. hit:
http://www.devtrain.de/artikel_626.aspx

zu deinem design: definiere mal NULLABLE sauber, eine m:n-tabelle mit null allowed ist etwas sinnlos, ebenso wie nullable PKs.

-j

Romanday
25-04-2006, 21:46
Für die Frage nach der Literatur kannst du mich haun, aber ich finde mit google einfach keine Beispiele zu meinem Problem.

Wenn Du in eine gute Buchhandlung gehst, findest du ein ganzes Regal voll.
Jedes Buch mal kurz anlesen, und das Buch kaufen welches Du verstehst.
Es gibt auch schon preiswerte gute Taschenbücher etc..

Mehlwurm
26-04-2006, 09:54
http://www.mrunix.de/forums/showthread.php?t=42873


hatte ein vergleichbares problem und hab es dann so hässlich gelassen ...


:-)

deathb
27-04-2006, 21:30
@Jasper: Danke für die Info.

Hab jetzt hier ein Buch von www.teia.de, jetzt bekomme ich schonmal beliebig viele Tabellen zusammen die eine 1:1 Beziehung haben.


SELECT *
FROM item
LEFT JOIN mediatype ON item.mediatypemediatype_identity = mediatype.mediatype_identity;
LEFT JOIN nächstetabelle ON item.fkausnächstetabelle = nächstetabelle.pk


Mit dieser Abfrage werden alle Sprachen eines items zu einem String zusammengefügt. (n:m)
SELECT * ,
GROUP_CONCAT(DISTINCT language.language SEPARATOR ', ') AS Sprachen
FROM item_all_language
LEFT JOIN item ON itemitem_identity = item.item_identity
LEFT JOIN language ON languagelanguage_identity = language.language_identity
GROUP BY item.titel;

Das selbe Spiel für die surnamen der Autoren....(n:m)
SELECT * ,
GROUP_CONCAT(DISTINCT author.surname SEPARATOR ', ') AS Sprachen
FROM item_all_author
LEFT JOIN item ON itemitem_identity = item.item_identity
LEFT JOIN author ON authorauthor_identity = author.author_identity
GROUP BY item.titel;

Aber wie kann man diese beiden Abfragen kombinieren so das alle Autoren sowie alle Sprachen eines items angezeigt werden?

Romanday
28-04-2006, 03:35
Aber wie kann man diese beiden Abfragen kombinieren so das alle Autoren sowie alle Sprachen eines items angezeigt werden?

Das ist nicht so spaßig so etwas aus dem Kopf zu schreiben.
Warum hängst du nicht ein kleines SQL Backup (als *.txt File) an dein Posting?
Dir nimmt doch hier keiner was weg.

deathb
28-04-2006, 09:28
Bin mir nicht sicher was du genau meinst, hab hier mal

mysqldump --user .... --password stahl >db.sql

angehängt.
Enthält die Struktur und die Daten soweit ich das überblicken kann.
Importieren kann man das mit:

mysql> CREATE DATABASE stahl;

und am prompt mit:
cat db.sql |mysql --user benutzername --password stahl

http://home.pages.at/metalfan/db.sql

deathb
29-04-2006, 15:59
SELECT * FROM item
LEFT JOIN item_all_author ON item.item_identity =
item_all_author.itemitem_identity
LEFT JOIN author ON item_all_author.authorauthor_identity =
author.author_identity
LEFT JOIN item_all_language ON item.item_identity =
item_all_language.itemitem_identity
LEFT JOIN language ON item_all_language.languagelanguage_identity =
language.language_identity

In diesem Beispiel fehlt nur noch GROUP_CONCAT um für alle Sprachen/Autoren jedes Titels nur ein Ergebnis zu bekommen....aber how?

deathb
30-04-2006, 16:43
So nah und doch so fern:

SELECT titel,item_identity,type, GROUP_CONCAT(DISTINCT(CONCAT(author.surname, " ",author.first_name))) AS Autoren, GROUP_CONCAT(DISTINCT language) AS Languages FROM item
LEFT JOIN item_all_author ON item.item_identity =
item_all_author.itemitem_identity
LEFT JOIN author ON item_all_author.authorauthor_identity =
author.author_identity
LEFT JOIN item_all_language ON item.item_identity =
item_all_language.itemitem_identity
LEFT JOIN language ON item_all_language.languagelanguage_identity =
language.language_identity
LEFT JOIN mediatype ON item.mediatypemediatype_identity = mediatype.mediatype_identity
GROUP BY item.titel;


Julius