MySQL Abfrage über zwei Tabellen in gleicher Datenbank?

...komplette Frage anzeigen

2 Antworten

Wenn Du zwei Tabellen angibst, werden diese beide Tabellen miteinander verknüpft. Nachdem Du keine Regel für die Verknüpfung angegeben hast, wird jeder Satz der einen Tabelle mit jedem Satz der anderen Tabelle verknüpft. Wenn jede Tabelle 1000 Sätze hätte, würdest Du 1 Mio Ergebnisse bekommen (normalerweise ist das ein Riesenproblem, wenn man die Verknüpfung vergisst oder auch unzureichend festlegt, bei größeren Dateien rennt die Datenbank mitunter tagelang, bis sie fertig wird).

Für Deine Aufgabe musst Du die beiden selects mit UNION verbinden:

SELECT * FROM hund WHERE name LIKE '%$suchwort%'
UNION
SELECT * FROM katze WHERE name LIKE '%$suchwort%'
ORDER BY 1


Dabei ist zu beachten: Die selektierten Datenfelder der beiden Selects müssen formal übereinstimmen, dürfen aber anders heißen. Ein Sortieren ist möglich, muss dann aber am Schluss stehen (hier optional als Beispiel). Dabei müssen die Sortierfelder als Spalten-Nr angegeben werden (weil ja die Namen nicht übereinstimmen müssen). Also ORDER BY 1 DESC, 3 würde nach der 1. Spalte absteigend und nach der 3. Spalte aufsteigend sortieren. Besonderheit: Auch wenn man beim SELECT den Zusatz DISTINCT angibt, können Doppelte im Ergebnis vorkommen, Weil diese Klausel sich nicht auf das Gesamtergebnis bezieht. Wenn man unterscheiden muss, aus welcher Tabelle der Satz stammt (kommt oft vor), kann man die Sätze mit einer Konstanten markieren:

SELECT 'H', name FROM hund WHERE name LIKE '%$suchwort%'
UNION
SELECT 'K', name FROM katze WHERE name LIKE '%$suchwort%'








Hallo Wotan38, herzlichen Dank für Deine Antwort. Hört sich schlüssig an, aber klappt leider nicht. Habe die where Komponenten erstmal weggelassen, aber auch die simpelste Variante klappt nicht. Setze ich nur:

$query="SELECT * FROM hunde";

oder

$query="SELECT * FROM katzen";

kommen jeweils die Ergebnisse der Tabelle ... sagen wie also z.b. 7 und 8 Katzen.

Kombiniere ich die Abfrage folgendermaßen: 

$query="SELECT * FROM hunde UNION SELECT * FROM katzen";

kommt gar nichts und es lädt ohne Ende :-( Erwartung/ gewünschtes Ergebnis wäre, dass dann alle 15 Treffer (aus beiden Tabellen = 7+8) aufgelistet werden. Was mache ich falsch?

Danke für Deinen Gedankenanstoß!!! Habe schon gegoogelt, aber so wie von Dir dargestellt und von mir umgesetzt müsste es eigentlich korrekt sein.

0
@anjasalz1973

Es hat geklappt :-)) Es fehlte ein ";" am ende des SELECT. bei der Kombi-Abfrage ist dies scheinbar zwingend erforderlich. Bei der einfachen ging es ohne. Läuft jetzt... Vielen Dank!!!!

0
@anjasalz1973

An sich muss jede Abfrage mit Semikolon abgeschlossen werden. Wenn man nur eine Abfrage hat und danach kommt nichts mehr, kann man bei manchen Systemen das Semikolon weglassen. Wenn man mehrere einzelne Abfragen auf einmal an die Datenbank schickt, ist das Semikolon zwingend erforderlich, damit die Datenbank weiß, wo die eine aufhört und die andere anfängt.

0

Aber wieso machst du select * und nicht select name?

Und es sollte mit DISTINCT gehen je nach syntax (zB hier für SQL https://www.w3schools.com/sql/sql_distinct.asp)

also so etwas in der Art:


SELECT DISTINCT a.name, b.name from hunde a, katzen b where a.name = b.name

So oder so in der Art

Was möchtest Du wissen?