mysql - Entscheidung, auf welche Tabelle zugegriffen wird

Sprint

Erfahrenes Mitglied
Hallo,

für einen Autohändler soll ich eine Seite erweitern. Dabei handelt es sich um eine Art Wunschliste, in die Anfragen über gebrauchte Kfz eingetragen werden. Wenn der Lieferant neu ist, werden dessen Firmenname, Adresse usw. mit eingetragen und später in die Stammdaten übernommen. Beim Anlegen einer solchen Anfrage kann man aber auch bereits bestehende Lieferanten auswählen. In dem Fall werden die dann nur mit ihrer internen Nummer eingetragen. Bis jetzt bestand die Auflistung der offenen Anfragen aus Fahrgestellnr. und Modell. Nun soll aber auch noch Name, PLZ und Ort des Lieferanten mit aufgeführt werden. Diese Daten sind ja aber eben nicht immer in der Wunschliste vorhanden.
Nun meine Frage. Kann man eine MySQL Abfrage so gestalten, daß Daten A und B immer aus Tabelle1 und Daten C, D und E - wenn vorhanden - aus Tabelle 1, ansonsten aus Tabelle2 geholt werden? Ich möchte das nur ungern in mehrere Abfragen aufteilen, da die Zugriffe dann um 2-300 % steigen würden.
 
Grob zusammengeschustert könnte das etwa so aussehen

SQL:
SELECT d, c, e
FROM table1
UNION SELECT d, c, e
FROM table2
WHERE (d, c e) NOT IN (SELECT d, c, e FROM table1)
 
Zuletzt bearbeitet von einem Moderator:
Hi Yaslaw,

das würde auch so funktionieren, aber es sind noch ein paar Felder aus Tabelle1, die unbedingt mit rein müssen, da ich sonst nur eine komplette Auflistung der Lieferanten bekomme. Nur wenn ich die mit einsetze, bekomme ich beim Test mit phpMyAdmin die Fehlermeldung "The used SELECT statements have a different number of columns". Diese drei Felder sind aber nicht in beiden Tabellen vorhanden.

Das hier ist der originale SQL Befehl:
SQL:
select wunschnr, fahrgnr, modell, plz, ort, firmenname 
from wunschkfz 
union select plz, ort, firmenname from lieferant 
where (plz, ort, firmenname) not in (select plz, ort, firmenname from wunschkfz) 
order by plz;
 
Zuletzt bearbeitet von einem Moderator:
Die weiteren Felder kannst du nachher hinzufügen

Bei einem UNION müssen beide SELECT die gleiche Anzahl Felder liefern

SQL:
SELECT
	t1.a,
	t1.b,
	data.d,
	data.c,
	data.d
FROM
	table1 AS t1
	INNER JOIN (SELECT d, c, e
				FROM table1
				UNION SELECT d, c, e
				FROM table2
				WHERE (d, c e) NOT IN (SELECT d, c, e FROM table1)) AS data
		ON %%deine Verknüpfungsbedinung%%
 
Zuletzt bearbeitet von einem Moderator:
Ich würde beide Lieferantentypen, bestehende und vorgeschlagene, in derselben Tabelle speichern, aber mit einem entsprechendenFlag in einer eventuell neu anzulegenden Spalte versehen. Das würde die Abfrage einfacher und wahrscheinlich auch effizienter machen.
 
Hi Yaslaw,

kannst du mir vielleicht näher erläutern, was du mit Verknüpfungsbedingungen meinst? Alle Varianten, die ich da ausprobiert habe, brachten nur Fehlermeldungen, daß dieses oder jenes Feld unbekannt ist. Ich hab auch versucht, im MySQL Handbuch was zu finden, bin da aber auch kläglich gescheitert.

@Vereth: Da hatte ich auch schon einmal drüber nachgedacht, ist aber in diesem Fall nicht praktikabel. Vor allem würden Daten in der Lieferantentabelle auftauchen, die vielleicht gar nicht rein sollen.
 
Einfaches Where

tabelle1.feld1 = tabelle2.t1_feld1 AND tabelle1.Code1 = tabelle2.Code1 etc
 
Einfaches Where

tabelle1.feld1 = tabelle2.t1_feld1 AND tabelle1.Code1 = tabelle2.Code1 etc

Dann hatte ich das zwar schon richtig vermutet, denn so hatte ich es auch schon, aber er bringt mir immer ein unknown column 'table2.y'.

SQL:
SELECT
    t1.a,
    t1.b,
    t1.c,
    DATA.d,
    DATA.e,
    DATA.f
FROM
    table1 AS t1
    INNER JOIN (SELECT c, d, e
                FROM table1
                UNION SELECT c, d, e
                FROM table2
                WHERE (c,d,e) NOT IN (SELECT c, d, e FROM table1)) AS DATA
        ON t1.x = table2.y
 
Zuletzt bearbeitet von einem Moderator:
Omg.
Ich habe dir nicht deine Lösung presentiert, sondern ein Prinzip wie man es lösen könnte.

Du musst alles durch deine Tabellennamen und Spaltennamen ersetzen.

Sorry, wenn ich mal so Frage.
Du hast ja einen Auftrag etwas zu machen. Hast du vorher schon mal mit SQL etwas zu tun gehabt?
 
Ich bin zwar blond, aber so blond dann auch nicht. Ich hatte schon die entsprechenden Namen eingesetzt und ich bin auch nicht völlig ahnungslos, was MySQL angeht. Nur ist das ein Bereich, mit dem ich noch nie was zu tun hatte. Hier also der echte Code:

SQL:
SELECT
    wun.wunschnr,
    wun.fahrgnr,
    wun.modell,
    DATA.plz,
    DATA.ort,
    DATA.firmenname
FROM
    wunschkfz AS wun
    INNER JOIN (SELECT plz, ort, firmenname
                FROM wunschkfz
                UNION SELECT plz, ort, firmenname
                FROM lieferant
                WHERE (plz, ort, firmenname) NOT IN (SELECT plz, ort, firmenname FROM wunschkfz)) AS DATA
        ON WHERE wun.lieferantnr = lieferant.liefernr ORDER BY plz;
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück