MySQL -> Zwei Tabellen in Abhänigkeit auslesen.
Guma
- datenbank
Hallo zusammen,
ich habe eine Datenbank vorliegen in der zwei Tabellen angelegt wurden:
Tabelle1: idfirma, name, adresse
Tabelle2: id, idfirma, kurztext, langtext, angebote
Sprich: in Tabelle 1 sind die Kontaktdaten drin und in Tabelle 2 die Inhalte (Texte)
Über die idfirma kann ich beide Tabellen ansprechen, denn die ist eindeutig zugeordnet: z.B. idfirma=21
Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
idfirma, name, adresse, kurztext, langtext und angebote.
Gibts da was von SQL oder auch ein SELECT-Beispiel?
Guma
hi,
Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
idfirma, name, adresse, kurztext, langtext und angebote.Gibts da was von SQL oder auch ein SELECT-Beispiel?
Du möchtest dich über JOINs informieren.
Im SELFHTML-Raum gibt es zwei sehr aufschlussreiche Feature-Artikel dazu:
Einführung: JOINs und Fortgeschrittene Jointechniken
gruß,
wahsaga
Noch ne Frage zu den fortgeschrittenen Joins:
Ich habe jetzt drei Tabellen, die über jeweils ein TabellenFeld "id_firma" verknüpft sind.
meine drei Tabellen mit Felder:
.01 Tabelle logo_firma:
li_id | li_name
.02 Tabelle logo_leistungen:
id_firma | leistungen
.03 Tabelle logo_form:
id_firma | beschreibung
li_id und id_firma haben pro Kunden eine Zuordnung z.B. 21 und gehören damit zusammen.
jetrzt mein selectversuch:
SELECT
li_id
li_name
t1.id_firma,
leistungen,
beschreibung
FROM (logo_form AS t1
INNER JOIN logo_leistungen AS t2
ON t1.id_firma = t2.id_firma)
INNER JOIN logo_firma
ON t1.id_firma = logo_firma.li_id
MySQL meldet:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't1 . id_firma , leistungen , beschreibung FROM ( logo_form AS t1 IN' at line 1
Was mache ich bei der Abfrage falsch? Guma
Hallo
> SELECT
> li_id -- da fehlt was
> li_name -- da auch
> t1.id_firma,
> leistungen,
> beschreibung
> FROM (logo_form AS t1
> INNER JOIN logo_leistungen AS t2
> ON t1.id_firma = t2.id_firma)
> INNER JOIN logo_firma
> ON t1.id_firma = logo_firma.li_id
Was mache ich bei der Abfrage falsch?
Sei nicht so sparsam. Spendiere dem Statement ein paar Komma.
Übrigens: MySQL 4.x und älter ignorieren Klammern :-( (Ich weiß, dass das in meinem Artikel noch fehlt), ich weiß, dass einige meiner Abfragen erst von MySQL 5.x unterstützt werden.
Welche Version hast Du im Einsatz.
Freundliche Grüße
Vinzenz
Hi,
Sei nicht so sparsam. Spendiere dem Statement ein paar Komma.
Sei nicht so sparsam. Spendiere dem letzten Wort Deines Satzes noch die Endung "ta". ;-)
cu,
Andreas
Hallo Forum,
Tabelle1: idfirma, name, adresse
Tabelle2: id, idfirma, kurztext, langtext, angeboteSprich: in Tabelle 1 sind die Kontaktdaten drin und in Tabelle 2 die Inhalte (Texte)
Über die idfirma kann ich beide Tabellen ansprechen, denn die ist eindeutig zugeordnet: z.B. idfirma=21
Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
idfirma, name, adresse, kurztext, langtext und angebote.Gibts da was von SQL oder auch ein SELECT-Beispiel?
Beispiel:
SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'
MfG
cross
Hallo cross,
Tabelle1: idfirma, name, adresse
Tabelle2: id, idfirma, kurztext, langtext, angebote
Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
idfirma, name, adresse, kurztext, langtext und angebote.Gibts da was von SQL oder auch ein SELECT-Beispiel?
Beispiel:
SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'
1. Es fehlen geforderte Spalten: name und adresse
2. Es fehlt eine notwendige Tabellenangabe: Tabelle1
3. Es ist eine überflüssige Spalte dabei: id
4. Diese WHERE-Klausel liefert keinen impliziten Join,
die einfachen Anführungszeichen wären überflüssig.
5. Es ist empfehlenswert, die explizite JOIN-Syntax zu verwenden.
Also vier Fehler und eine Unschönheit.
Viel sinnvoller ist es, den Verweisen in wahsagas Posting zu folgen.
Freundliche Grüße
Vinzenz
Ich verstehe Vinzenz und bedanke mich bei wahsager für den Tipp.
Geht das in die richtige Richtung?
SELECT idfirma, name, adresse, id,kurztext, langtext, angebote
FROM Tabelle1, Tabelle2
WHERE Tabelle1.idfirma = Tabelle2.idfirma
Grüße von Guma
hi,
Geht das in die richtige Richtung?
SELECT [...] FROM Tabelle1, Tabelle2
Nein, das bildet ein Kreuzprodukt.
gruß,
wahsaga
Hi wahsaga
SELECT [...] FROM Tabelle1, Tabelle2
Nein, das bildet ein Kreuzprodukt.
Nein, also, was oben steht schon, aber nicht die Query, die gepostet wurde. Es ist eine unschöne Syntax, funktioniert aber und selbst MySQL bildet kein Kreuzprodukt mehr sondern kann es optimieren.
Gruss Daniela
yo,
Es ist eine unschöne Syntax, funktioniert aber und selbst MySQL bildet kein Kreuzprodukt mehr sondern kann es optimieren.
es ist zwar richtig, dass wahsaga die bedingung in der WHERE klausel übersehen hat, aber was du da schreibst ist auch nicht richtig. ein kreuzprodukt ist keine teufelswerkzeug, sondern kann durchaus gewünscht sein. insofern beherscht jedes dbms ein kreuzprodukt, wenn es den gewünscht ist. un daran gibt es dann auch nichts zu optimieren.
Ilja
Moin!
es ist zwar richtig, dass wahsaga die bedingung in der WHERE klausel übersehen hat, aber was du da schreibst ist auch nicht richtig. ein kreuzprodukt ist keine teufelswerkzeug, sondern kann durchaus gewünscht sein. insofern beherscht jedes dbms ein kreuzprodukt, wenn es den gewünscht ist. un daran gibt es dann auch nichts zu optimieren.
Richtig, aber die Syntax "FROM tab1, tab2 WHERE tab1.id=tab2.id" produziert auch in MySQL eben nicht zuerst ein Kreuzprodukt, und filtert dann (im Gegensatz zu "FROM tab1 JOIN tab2 ON tab1.id=tab2.id"), sondern es wird gleich zu einem entsprechenden JOIN hin optimiert.
Die Lesbarkeit solcher Statements ist hingegen deutlich eingeschränkt, weil man im WHERE eine Mischung aus Join-bedingten Bedingungen und abfragebedingten Bedingungen hat. Eine Trennung, wie sie mit der JOIN-Syntax erfolgt, ist deutlich verständlicher.
- Sven Rautenberg
yo,
Richtig, aber die Syntax "FROM tab1, tab2 WHERE tab1.id=tab2.id" produziert auch in MySQL eben nicht zuerst ein Kreuzprodukt, und filtert dann (im Gegensatz zu "FROM tab1 JOIN tab2 ON tab1.id=tab2.id"), sondern es wird gleich zu einem entsprechenden JOIN hin optimiert.
ok, ich denke da habe ich es einfach falsch interpretiert. ich dachte es geht generell darum, ob dbms noch kreuzprodukte bilden.
wobei man dazu sagen muss, dass es eigentlich genau umgekehrt deiner begründung ist. das dbms zieht die JOIN beidnung in die WHERE klausel mit rein. insofern wird keine join bedingung zuerst ausgeführt und dafür die abfrage optimiert. bei oracle ist es unter anderem auch noch so, dass die reihenfolge der joins in umgekehrter reihenfolge der schreibweise ausgeführt wird, also festgelegt ist. ausserdem sollten bestimmte anweisungen in der where klausel vor den joins ausgeführt werden und bei abhängigen Daten ist es auch die verwendung der indexe auf eine tabelle nur beschränkt möglich.
Ilja
Moin!
Ich verstehe Vinzenz und bedanke mich bei wahsager für den Tipp.
Geht das in die richtige Richtung?
Du hast PHPMyAdmin (wenn nicht, wird es Zeit, das zu haben), und du kannst ausprobieren, was passiert. Das ist in jedem Fall schneller, als hier nachzufragen, ob ein Statement mit Tabellen, deren Inhalt wir nicht kennen, die Infos liefert, die du willst.
- Sven Rautenberg
Hallo
Geht das in die richtige Richtung?
SELECT idfirma, name, adresse, id,kurztext, langtext, angebote
FROM Tabelle1, Tabelle2
WHERE Tabelle1.idfirma = Tabelle2.idfirma
Unschön.
Was hast Du gegen
SELECT
idfirma,
name,
adresse,
kurztext,
langtext,
angebote
FROM Tabelle1 t1
INNER JOIN Tabelle2 t2
ON t1.idfirma = t2.idfirma
wie Du es in Rouvens Einführung nachlesen kannst. Es ist eine _sehr gute_ Idee, die explizite JOIN-Syntax zu verwenden, weil so sehr schön zwischen JOIN-Bedingungen und Einschränkungen der Ergebnismenge durch die WHERE-Klausel unterschieden wird. Ich finde die resultierenden SQL-Anweisungen viel besser lesbar.
Laut Deinem Ausgangsposting benötigst Du die Spalte id nicht.
Freundliche Grüße
Vinzenz
Hallo Ingrid,
so nicht! Fertiger Code, fehlerhaft, unkommentiert. Sowas aber auch:-(
SELECT
t1.idfirma, -- Wenn eine Spalte in mehr als einer Tabelle
-- vorkommt, ist sie eindeutig zu referenzieren
-- d.h. Tabellenname.Spaltenname
name,
adresse,
kurztext,
langtext,
angebote
FROM Tabelle1 t1 -- Tabellenaliase sparen Schreibarbeit
-- und können SQL-Anweisungen lesbarer machen.
INNER JOIN Tabelle2 t2 -- Explizite JOIN-Syntax
ON t1.idfirma = t2.idfirma
Jetzt sollte der Fehler behoben sein und die Kommentare das Statement verständlicher machen.
Grüße
Vinzenz
Danke für das gut kommentierte Beispiel. Ich werde das jaetzt in PHPmyAdmin testen.
Guma
SELECT A.idfirma, A.name, A.adresse, D.id,D.kurztext, D.langtext, D.angebote
FROM Tabelle A, Tabelle D
WHERE A.idfirma = D.idfirma
Geht das nicht?
Versuchs doch mal?!
Ich habe mich gefragt, ob ein Join tatsächlich nötig ist und ich das nicht über eine Abfrage lösen kann.
Du schreibst:
SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'
ich denke:
das ist schon mal prima. aber meine id ist bei beiden mit "idfirma" gekennzeichnet.
Auf meine Inhalte aus Tabelle 2 kann ich ja dann gar nicht zugreifen - ich benötige die aber.
Wie steht es mit join, macht das meine Abfragen langsamer?!
Guma
Hallo
Ich habe mich gefragt, ob ein Join tatsächlich nötig ist
die Antwort lautet "Ja".
und ich das nicht über eine Abfrage lösen kann.
Die Antwort lautet ebenfalls "Ja".
Du schreibst:
SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'
ich denke:
das ist schon mal prima.
Das ist überhaupt nicht prima.
Auf meine Inhalte aus Tabelle 2 kann ich ja dann gar nicht zugreifen - ich benötige die aber.
Ja, wissen wir. Deshalb benötigst Du einen Join.
Wie steht es mit join, macht das meine Abfragen langsamer?!
Nein, der JOIN ist das sinnvolle Werkzeug, um Dein Problem zu lösen.
Warum liest Du nicht die Artikel zur JOIN-Thematik?
MySQL bietet übrigens mit EXPLAIN ein gutes Werkzeug, um Deine Abfragen zu optimieren. Sinnvolle Indexe sollten es bereits tun.
Freundliche Grüße
Vinzenz