MySQL - Join Klausel
bubble
- datenbank
0 Rudi Ratgeber0 hotti
Erstmal vorweg dank des Hinweises:
MySQL 5.5.27
Ich habe mich lange, lange Zeit davor gedrückt mit Joins zu arbeiten, das möchte ich jetzt ändern und habe dazu zu einem konkreten Beispiel eine Frage.
Hier mal die Struktur
mains: id,aid,sonstiges
alts: id,mid,name
Beispiele für die Datensätze:
main:
1,1,irgendwas
2,3,irgendwas_anderes
alts:
1,1,heinrich
2,1,guenther
2,2,max
mit
SELECT * FROM
mainsJOIN
altsON
mains.
ID=
alts.
MID``
bekomm ich dann ich dann auch schon alle daten die ich wollte.
Wie sieht es nun aber aus wenn ich eine "Suche" einbauen will?
Wenn ich nun nach "heinrich" suche, ist folgendes mein Wunschergebis:
m.id,m.aid,m.name[m.aid],sonstiges,a.id,a.name
1,1,heinrich,irgendwas,1,heinrich
1,1,heinrich,irgendwas,2,guenther
Oder ist die Struktur komplett für den Müll?
Im Endeffekt bastle ich momentan an einem Modul für einen Raid-Chatbot, wo man mit seinem Hauptcharakter und Alternativcharaktern registriert ist und dass ich - je nach dem mit welchem Charakter beigetreten wird - alle Daten des Spielers bekomme mit nur einer Abfrage. Oder wären mehrere Anfragen schneller? (Ich denke eher nicht)
MfG
bubble
Wie sieht es nun aber aus wenn ich eine "Suche" einbauen will?
Wenn ich nun nach "heinrich" suche, ist folgendes mein Wunschergebis:m.id,m.aid,m.name[m.aid],sonstiges,a.id,a.name
1,1,heinrich,irgendwas,1,heinrich
1,1,heinrich,irgendwas,2,guenther
Ergänze die WHERE Klausel, um Teilmengen zu definieren.
WHERE alts.name = "heinrich"
Das ist schon alles.
Rudi
m.id,m.aid,m.name[m.aid],sonstiges,a.id,a.name
hier ist ein böser Tippfehler, da sollte a.name[m.aid] stehen
1,1,heinrich,irgendwas,1,heinrich
1,1,heinrich,irgendwas,2,guentherErgänze die WHERE Klausel, um Teilmengen zu definieren.
WHERE alts.name = "heinrich"
Dann spuckt er mir aber
1,1,heinrich,irgendwas,2,guenther
nicht aus, weil der alts-Datensatz mit der ID 2 als namen guenther hat.
Ich brauch quasi eine Möglichkeit wie ich die MID vom "heinrich"-Datensatz zwischen speichern kann um dann die vorhin erwähnte Anfrage damit zu erweitern.
MfG
bubble
Sorry fürs Doppelposting.
Man kann ja
SELECT * FROM
altsWHERE
MID= (SELECT
MIDFROM
altsWHERE
NAME = 'heinrich')
benutzen, dann hab ich schon mal alle relevanten Daten aus alts
.
Nun hab ich probiert, das mit der Join-Anfrage zu kombinieren:
SELECT * FROM
mainsJOIN
altsON
mains.
ID=
alts.
MIDAND 'alts'.'MID' = (SELECT
alts.
MIDFROM
altsWHERE
alts.
NAME='heinrich')
Aber dann meckert mysql: "#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 '.'MID' = (SELECT alts
.MID
FRO...."
=/
MfG
bubble
Sorry fürs Doppelposting.
Machen wir 3 draus =/ (Tut mir wirklich Leid)
SELECT * FROM
mainsJOIN
altsON
mains.
ID=
alts.
MIDAND 'alts'.'MID' = (SELECT
alts.
MIDFROM
altsWHERE
alts.
NAME='heinrich')
Ein Hoch, darauf das SELFHTML ein anderes Syntax-Highlighting verwendet als phpMyAdmin >.<
Also bekomme ich jetzt fast alle relevanten Daten.
Ich müsste nur noch das mains
.AID
zum alts
.NAME
mit der entsprechenden ID konvertieren :s
Geht das recht einfach? Oder sollte ich da dann doch auf PHP-Code setzen?
MfG
bubble
deine textliche Beschreibung ist mir unverständlich.
Kann es sein, dass du mit dem Suchbegriff "heinrich" reingehst, die Antwort "irgendwas" bekommst und zu "irgendwas" wieder die Namen möchtest?
Rudi
Kann es sein, dass du mit dem Suchbegriff "heinrich" reingehst, die Antwort "irgendwas" bekommst und zu "irgendwas" wieder die Namen möchtest?
mains.aid stellt die id eines Datensatzes von alts dar.
Nun will ich im SELECT-Teil anstatt der mains.aid der entsprechende alts.name ausgeben wird.
Hm. Wenn die Datensätze als Arrays vorhanden wären a la $main und $alts und der ID-Wert des jeweiligen Datensatzes der Index im Array wäre, möchte ich $alts[$main_aid]["NAME"] haben, wobei $main_aid der den mains
.aid
-Wert darstellt.
Im SQL-Statement ungefähr so: "SELECT Zauberei(alts
.name
,mains
.aid
) FROM ..."
Wobei natürlich "Zauberei" die Funktion sein soll mir den Namen anhand der ID gibt.
MfG
bubble
Oh Gott, da hab ich ja gestern das Schreiben komplett verlernt.
Das eigentliche Problem hab ich gelöst:
SELECT
tara_mains.
ID,
tara_alts.
ID,
tara_alts.
NAME,
tara_mains.
POINTS,
tara_mains.
JOINS,
tara_mains.
LEADS,(SELECT
tara_alts.
NAMEFROM
tara_alts,
tara_mainsWHERE
tara_alts.
ID=
tara_mains.
AID) FROM
tara_mainsJOIN
tara_altsON
tara_mains.
ID=
tara_alts.
MIDAND
tara_alts.
MID= (SELECT
tara_alts.
MIDFROM
tara_altsWHERE
tara_alts.
NAME='heinrich')
Hab aber auch schon ein neues Problem:
DELETE
tara_alts,
tara_mainsFROM
tara_alts,
tara_mainsWHERE
tara_alts.
MID= (SELECT
tara_alts.
MIDFROM
tara_altsWHERE
tara_alts.
NAME= 'heinrich') AND
tara_mains.
ID= (SELECT
tara_alts.
MIDFROM
tara_altsWHERE
tara_alts.
NAME = 'heinrich')
Ich versteh nicht genau, was an diesem Statement falsch ist.
#1093 - You can't specify target table 'tara_alts' for update in FROM clause
Sagt mir phpMyAdmin/MySQL.
MfG
bubble
Tach!
DELETE
tara_alts,
tara_mainsFROM
tara_alts,
tara_mainsWHERE
tara_alts.
MID= (SELECT
tara_alts.
MIDFROM
tara_altsWHERE
tara_alts.
NAME= 'heinrich') AND
tara_mains.
ID= (SELECT
tara_alts.
MIDFROM
tara_altsWHERE
tara_alts.
NAME= 'heinrich')
Ich versteh nicht genau, was an diesem Statement falsch ist.
#1093 - You can't specify target table 'tara_alts' for update in FROM clause
MySQL gestattet (derzeit) nicht, dass du in einer Tabelle löschst und sie gleichzeitig als Datenquelle in einem Subquery angeben kannst. Daselbe gilt für Updates.
dedlfix.
hi,
Wie sieht es nun aber aus wenn ich eine "Suche" einbauen will?
Guck Dir match() und against an.
Für eine Suche joinst Du die Tabellen zusammen, welche die benötigten Felder haben für die match()-Funktion (MySQL).
Die Funktion match() kriegt die voll qualifizierten Namen, in der Liste hinter SELECT kannst und solltest Du eindeutige Alias-Namen vergeben.
Das könnte dann ungefähr so aussehen:
SELECT
a.name as name,
a.id as id
FROM mains m
JOIN alts.a ON a.mid=m.id
WHERE MATCH(a.name)AGAINST(? IN BOOLEAN MODE)
wobei das ? dann in Deinem Code mit den Suchbegriffen gefüttert wird. Ggf. weitere WHERE-Klausen und MATCH() kann auch mehrere Felder bekommen...
Hotti