SQL-Abfrage-Problem
Pit Stop
- datenbank
Hallo,
ich habe scheinbar ein Brett vorm Kopf:
Ich habe 3 Tabellen(r,i und m) und mache eine Abfrage über Join
SELECT r.name, i.name, m.name
FROM r
INNER JOIN m ON r.m_id = m.id
INNER JOIN i ON r.id = i.r_id
Ich bekomme allerdings ein Ergebnis welches nur fast richtig ist;-)
Auf r_id passen mehrere i_name.
Bei der Abfrage bekomme ich allerdings nur jeweils eine i_name angezeigt.
Was mache ich falsch?
danke, pit
Hallo,
Ich habe 3 Tabellen(r,i und m) und mache eine Abfrage über Join
SELECT r.name, i.name, m.name
FROM r
INNER JOIN m ON r.m_id = m.id
INNER JOIN i ON r.id = i.r_id
das ist für keines der mir bekannten Datenbankmanagementsysteme (DBMS, zum Beispiel DB2, MySQL, Oracle, PostgreSQL, MS SQL Server) ein Problem.
> Ich bekomme allerdings ein Ergebnis welches nur fast richtig ist;-)
> Auf r\_id passen mehrere i\_name.
> Bei der Abfrage bekomme ich allerdings nur jeweils eine i\_name angezeigt.
dann wird das schon richtig sein.
> Was mache ich falsch?
a) Du verschweigst das DBMS, das Du verwendest, sowie dessen Version.
b) Du bleibst ein nachvollziehbares Beispiel schuldig. Das heisst Beispieldaten,
anhand derer man Dein Problem nachvollziehen könnte.
Zusätzlich zu den Beispieldaten in den drei Tabellen solltest Du noch
angeben, welches Ergebnis Du erhältst und welches Du erwartest.
Ohne b) kann man Dir nicht zielführend helfen. So kann man nur sagen: "Du machst etwas falsch".
Vielleicht hast Du auch nur eine falsche Erwartungshaltung und müsstest ein anderes SQL-Statement verwenden, um das von Dir gewünschte Ergebnis zu erhalten.
Freundliche Grüße
Vinzenz
ok, ich versuche es mal:
Bereich (tabelle 1(r))
id | name | oberbereich_id
--------------------------
1 | bereich1 | 1
2 | bereich2 | 1
3 | bereich3 | 2
Produkte (tabelle2(i))
id | name | bereich_id
----------------------
1 | produkt1 | 1
2 | produkt2 | 1
3 | produkt3 | 2
Oberbereich (tabelle 3(m))
id | name | farbe
1 | OB1 | #dddddd
2 | OB2 | #ff0000
So ist ungefähr die DB aufgebaut.
ich will jetzt folgendes Ergebnis haben:
Bereich1 -> produkt1, produkt2 -> OB1
danke im voraus
pit stop
yo,
sagst du uns auch noch die genaue abfrage dazu, welche du darauf los läßt, welche ergebnisse du rausbekommst nud welche du erwartet hättest ?
Ilja
jau, das ist die Abfrage:
SELECT bereich.name, produkt.name, oberbereich.name
FROM bereich
INNER JOIN oberbereich ON bereich.oberbereich_id = oberbereich.id
INNER JOIN produkt ON bereich.id = produkt.bereich_id
GROU BY bereich.name
heraus kommt:
bereich1 -> produkt1 -> ob1
herauskommen soll:
bereich1 -> produkt1, produkt2 -> ob1
danke!
yo,
du "schwindelst" uns an, vielmehr macht mysql das. jedes andere dbms würde dir bei dieser abfrage eine fehlermeldnug ausgeben, nur mysql geht dort einen anderen weg.
die regel lautet, du darfst in einer gruppierung nur spalten ausgeben, über die du auch gruppierst hast oder aber die eine aggregat-funktion wie MAX nutzen. aus performance gründen läßt mysql solch eine verletzung zu, aber die ist in meinen augen wenig sinnvoll.
du verletzt aber diese regel, indem du zusätzlich noch die spalten produkt.name, oberbereich.name und mit ausgibst und deswegen kommen solch merwürde, zufällige ergebnisse raus.
was du im moment machst ist lediglich über die spalte bereich.name zu gruppieren. erweitere die grupppierung, sofern das gewünscht ist oder aber nutze korrelierte unterabfragen.
Ilja
GROUP_CONCAT war die Lösung.
Danke für die Unterstützung;-)
pit
yo,
wie Vinz schon sagte, deine problembeschreibung ist für uns nicht sehr hilfreich, was es uns schwierig macht, dir zu helfen.
Auf r_id passen mehrere i_name.
i_name kommt nirgends vor, weder als tabellenname, noch als spaltenname und auch nicht als aliasname.
Bei der Abfrage bekomme ich allerdings nur jeweils eine i_name angezeigt.
Was mache ich falsch?
ich vermute, und es ist nur eine wage vermutung. dadurch dass du drei tabellen joinst, verlierst du die namen, vermutlich durch die tabelle m. du kannst das prüfen, indem du mal die m tabelle aus dem join raus nimmst. gegenfalls ist ein OUTER JOIN hier angebracht. aber wie gesagt, ohne hilfreiche daten fischen wir im trüben.
Ilja