verwendetes Datenbanksystem: SQLite und MySQL
Hallo!
Ich habe eine Abfrage über 3 Tabellen gebastelt.
Tabellenstruktur:
mcd (Felder: sid, faname, tel1, .....)
ownap (Felder: sid, vorname, nachname, ...)
mcpap (Felder: sid, vorname, nachname, ...)
In den Tabellen ownap und mcpap sind Personen gespeichert die über das Feld sid mit den Einträgen in mcd verknüpft sind.
Ziel ist eine Abfrage aller Einträge in mcd zu denen es entweder Einträge in ownap gibt wo das Feld nachname einen bestimmten Text enthält oder das selbe in mcpap.
Folgenden Query habe ich gebastelt:
SELECT m.sid, faname
FROM mcd as m, ownap as o, mcpap as p
WHERE (m.sid = o.sid AND o.nachname like '%test%') OR
(m.sid = p.sid AND p.nachname LIKE '%test%') GROUP BY m.faname
Das funktioniert auch, allerdings würde ich gerne wissen wie man das mit einem Join eleganter löst. Leider habe ich es noch nicht geschafft das Prinzip von Joins zu behirnen. Kann mir bitte jemand weiterhelfen?
Vielen Dank, lg
Mike
Hallo SunB,
im Prinzip hast du ja einen JOIN in deiner Query, siehts es nur nicht.
Ein JOIN würde in deinem Fall so aussehen:
SELECT ... FROM mcd m JOIN ownap o ON m.sid = o.sid
wobei das JOIN folgendes ersetzt:
SELECT ... FROM mcd m, ownap o WHERE (m.sid = o.sid)
Dementsprechend kannst du in meiner oben genannten JOIN noch eine WHERE Klausel anhängen in der du deine LIKE Bedingung hast.
Dazu gibt es noch LEFT JOIN, RIGHT JOIN und FULL JOIN auf welche ich jetzt nicht darauf eingehen will und du in der Doku nachlesen kannst.
Gruß
Michael
Hallo Michael!
Danke für Deine Antwort.
Ein Join mit 2 Tabellen ist für mich noch verständlich. Aber wie würde das mit allen 3 Tables aussehen? Also vom Ergebnis her das Gleiche wie mein Query?
Vielen Dank
Mike
P.S.: Ich wohne auch da wo andere Urlaub machen zwinker
Du kannst die JOINS natürlich auch erweitern. Die allgemeine Syntax lautet hierbei
t1 JOIN t2 ON bedingung JOIN t3 on bedingung
in deinem Fall also
SELECT ... FROM mcd m JOIN ownap o ON m.sid = o.sid JOIN mcpap p ON m.sid = p.sid
Anmerkend sei dabei gesagt dass die JOIN Anordnung eine performante Rolle spielt. Allgemein ist es m.E. besser von großen auf kleine Tabellen zu joinen.
P.S.: Ich wohne auch da wo andere Urlaub machen zwinker
gut so 😁
Wenn ich also meinen ursprünglichen Query mit Joins realisieren möchte, müsste das so aussehen:
SELECT mcd.sid, mcd.faname
FROM mcd
JOIN ownap ON mcd.sid=ownap.sid
JOIN mcpap ON mcd.sid=mcpap.sid
WHERE mcpap.nachname LIKE '%test%'
OR ownap.nachname LIKE '%test%'
GROUP BY mcd.faname
Leider bringt das keine Ergebnisse - Warum?
Danke nochmals!
Aha! Ich glaub das liegt an einem Logikproblem:
In der Tabelle mcd sind Firmen gespeichert.
In der Tabelle ownap sind Ansprechpartner gespeichert.
In der Tabelle mcpap sind auch Ansprechpartner gespeichert.
(Grund: unterschiedliche Herkunft der Ansprechpartner -> ich kann und will die nicht in einer Tabelle zusammenfassen)
Der User will jetzt Firmen nach Ansprechpartner suchen.
Das Problem ist dass ich die Firma X finden will egal ob der passende Ansprechpartner in einer der beiden Personentabellen oder in beiden vorhanden ist.
Würde der Join so wie ich ihn gemacht habe nicht voraussetzen dass der Ansprechpartner in beiden Tabellen (mcpap und ownap) vorhanden ist?
Würde der Join so wie ich ihn gemacht habe nicht voraussetzen dass der Ansprechpartner in beiden Tabellen (mcpap und ownap) vorhanden ist?
Ja das täte er.
Dann denke ich mir wirst du wohl deine anfänglich gepostete Query benutzen sollen.
So auf die schnelle fällt mir auch nicht ein wie man es mit einer JOIN hinbekommen sollte oder ob es überhaupt möglich ist.
edit: Ich rate dir, falls möglich die Tabellennamenbezeichnung zu überdenken.
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Es gibt 2 Gründe warum ich das mit Join lösen wollte.
Naja ... muss ich wohl versuchen das Problem anders zu lösen.
Danke Euch beiden!
Hallo,
du kannst auch zwei getrennte Abfragen machen und diese mit UNION verbinden:
SELECT mcd.sid, mcd.faname
FROM mcd
JOIN ownap ON mcd.sid=ownap.sid
WHERE ownap.nachname LIKE '%test%'
UNION
SELECT mcd.sid, mcd.faname
FROM mcd
JOIN mcpap ON mcd.sid=mcpap.sid
WHERE mcpap.nachname LIKE '%test%'
P.S.: Ich wohne auch da wo andere Urlaub machen zwinker
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hallo,
du kannst auch zwei getrennte Abfragen machen und diese mit UNION verbinden:
SELECT mcd.sid, mcd.faname FROM mcd JOIN ownap ON mcd.sid=ownap.sid WHERE ownap.nachname LIKE '%test%' UNION SELECT mcd.sid, mcd.faname FROM mcd JOIN mcpap ON mcd.sid=mcpap.sid WHERE mcpap.nachname LIKE '%test%'
Hier lernt man direkt noch was 😉
Die Lösung funktioniert super.Vielen Dank!