MYSQL Kreuztablle Abfrage

hallo wer weiss was,

ich habe ein problem mit einer abfrage in mysql. verstehe es derzeit nicht.

ich habe 3 tabellen.
in tabelle 1 befinden sich übungen (ex_id, ex_name)
in tabelle 2 befinden sich kategorien (ex_cat_id, ex_cat_name)
in tabelle 3 befindet sich die jeweiligen ids der vorherigen tabellen = ex_id und ex_cat_id … in tabelle 3 wird einer übung mehrer kategorien zugewiesen … nun möchte ich eine liste ausgeben die mir folgendes sagt:

Kategorie
-Übung
-Übung
Kategorie 2
-Übung
-Übung

usw … ich verstehe derzeit nicht wie ich einen join oder eine abfrage aussehen muss damit er mir das ausgibt ? …

jemand eine idee?

Hallo,

das müsste eigentlich so gehen:

SELECT * FROM table_1 RIGHT JOIN table_3 ON (table_3.ex_id=table_1.ex_id) RIGHT JOIN table_2 ON (table_3.ex_cat_id=table_2.ex_cat_id);

Viele Grüße,

Thorsten

ich habe 3 tabellen.
in tabelle 1 befinden sich übungen (ex_id, ex_name)
in tabelle 2 befinden sich kategorien (ex_cat_id, ex_cat_name)
in tabelle 3 befindet sich die jeweiligen ids der vorherigen
tabellen = ex_id und ex_cat_id … in tabelle 3 wird einer
übung mehrer kategorien zugewiesen … nun möchte ich eine
liste ausgeben die mir folgendes sagt:

select
ex_name, ex_cat_name
from
tab1, tab2, tab3
where
tab2.ex_cat_id = tab3.ex_cat_id and
tab1.ex_id = tab3.ex_id
group by ex_cat_name, ex_name
order by … – wonach auch immer

Hallo!

Du musst beim JOIN idealerweise die ID’s verknüpfen. In deinem Fall über Tabelle 3, da dort die Zuordnung gespeichert ist:

SELECT
tabelle2.ex_cat_name,
tabelle1.ex_name
FROM
tabelle3
JOIN tabelle1 ON (tabelle3.ex_id = tabelle1.ex_id)
JOIN tabelle2 ON (tabelle3.ex_cat_id = tabelle2.ex_cat_id)

Im JOIN werden also die Felder verknüpft. Die Reihenfolge ist egal, solange die Verknüpfung stimmt.
Wenn die Feldbezeichnung der zu verknüpfenden Felder in den Tabellen gleich ist (wie in deinem Fall) geht auch folgende schreibweise:

SELECT
tabelle2.ex_cat_name,
tabelle1.ex_name
FROM
tabelle3
JOIN tabelle1 USING (ex_id)
JOIN tabelle2 USING (ex_cat_id)

Du erhälst Datensätze die etwa so aussehen:

Kategorie1 -> Übung1
Kategorie1 -> Übung2
Kategorie2 -> Übung1
Kategorie2 -> Übung1

Wie du diese Anzeigen lassen willst, musst du dann in dem Programm/Script implementieren, dass die Daten weiterverarbeitet.

Viele Grüße

Die Liste, die du ausgeben willst, ist zweidimensional.

Du kannst das entweder mit zwei Abfragen lösen, oder indem du die zweidimensionale Liste „flach“ aus SQL holst und dann mit PHP/ASP/… die Unterteilung machst.

Da die erste Lösung einfacher ist, der dazugehörige Beispielcode:

  1. „SELECT ex_cat_id, ex_cat_name FROM kategorien“

Diese Datensätze gehst du in einer Schleife durch und machst für jede Zeile die zweite Abfrage:

  1. „SELECT u.ex_id, u.ex_name FROM zuweisungen AS z LEFT JOIN uebungen AS u ON u.ex_id=z.ex_id WHERE z.ex_cat_id=$CATID“

Wobei $CATID die Variable mit der ex_cat_id aus der ersten Abfrage ist.

Jemrijà

Ohje, ohje, für Join bin ich der falsche Ansprechpartner. Ich habe mich bisher meistens davor gedrückt, in dem ich verschachtelte „where“ und „and“ benutzt habe.
Aber google doch mal nach Inner Join und Outer Join.

SELECT
 `ex_cat_name`, `ex_name` 
FROM 
 `tabelle2` 
RIGHT JOIN 
 `tabelle3`
ON
 `tabelle3`.`ex_cat_id` = `tabelle2`.`ex_cat_id`
RIGHT JOIN
 `tabelle1`
ON
 `tabelle3`.`ex_id` = `tabelle1`.`ex_id`
ORDER BY
 `ex_cat_name`;

Gruß Marcel

Die Ausgabe ist Folgende:
http://i.imagebanana.com/img/m00u0imr/Unbenannt.PNG

Gruß Marcel

sorry, kann im moment leider nich weiterhelfen

cu
harald
***************

Hallo,

Na mit einem normalen Join.

Select * from tbl_3 as c Join tbl_2 as b on c.ex_cat_id = b.ex_cat_id Join tbl_1 a on c.ex_id = a.ex_id

Statt Stern kannst und solltest du nur die Daten ziehen, die du benötigst.

Lg frank

Hier mal eine Einführung in Joins

http://www.strassenprogrammierer.de/mysql-komplexe-a…

Lg frank

Huhu Tom,

Kann ich verstehen. Hast dir da auch nicht das einfachste rausgesucht. :wink:

Aber im Prinzip ist es gar nicht so schwer.

SELECT tabelle2.ex_cat_name, tabelle1.ex_name FROM
tabelle3 LEFT JOIN tabelle1 ON tabelle3.ex_id =
tabelle1.ex_id LEFT JOIN tabelle2 ON tabelle3.ex_cat_id = tabelle2.ex_cat_id ORDER BY
tabelle2.ex_cat_name, tabelle1.ex_name

Habs nicht getestet, aber sollte glaub ich so passen.

Grüße
Ingo

Hallo tom_b_85,

da muss eine recht komplexe SQL Abfrage geschrieben werden (Ich habe die Abfrage aus DB2 konvertiert. Sie muss also wahrscheinlich etwas geändert werden.) Zum Verständnis sollte es aber ausreichen.

Tabelle1 ist TAB1, Tabelle2 ist TAB2, Tabelle ist TAB3.

select t3.ex_id, t3.ex_cat_it from TAB3 t3
where t3.ex_id = t1.ex_id and t3.ex_cat_id = t2.ex_cat_id

union all

select t1.ex_id, t1.ex_name from TAB1 t1

union all

select t2.ex_cat_id, ex_cat_name from TAB2 t2

Erklärung:
Das erste SELECT liest die Schlüssel aus Tabelle 3 und
in der WHERE Klausel wird die Verknüpfung zum UNION hergestellt und die Daten aus Tabelle 1 und Tabelle 2 gefiltert.

In dem ersten UNION werden die Daten aus Tabelle 1 gelesen.

In dem zweiten UNION werden die Daten aus Tabelle 2 gelesen.

Möglicherweise muss das UNION durch ein vergleichbares Element in MySQL ersetzt werden.

MfG

cowboy_herby

Nun ich denke du solltest die beiden Tabellen 1 und 2 an die 3 Joinen. Probier das mal ob es klappt:

SELECT
 t1.ex\_id,
 t1.ex\_name,
 t2.ex\_cat\_id,
 t2.ex\_cat\_name,
 t3.ex\_id,
 t3.ex\_cat\_id
FROM
 table3 AS t3
LEFT JOIN 
 table1 AS t1
 ON t3.ex\_id=t1.ex\_id
LEFT JOIN 
 table2 AS t2
 ON t3.ex\_cat\_id=t2.ex\_cat\_id