bubble: MySQL - Join Klausel

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 mainsJOINaltsONmains.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

  1. 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

    1. 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,guenther

      Ergä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

      1. Sorry fürs Doppelposting.

        Man kann ja
        SELECT * FROM altsWHEREMID= (SELECTMIDFROMaltsWHERENAME = '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 mainsJOINaltsONmains.ID=alts.MIDAND 'alts'.'MID' = (SELECTalts.MIDFROMaltsWHEREalts.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

        1. Sorry fürs Doppelposting.

          Machen wir 3 draus =/ (Tut mir wirklich Leid)

          SELECT * FROM mainsJOINaltsONmains.ID=alts.MIDAND 'alts'.'MID' = (SELECTalts.MIDFROMaltsWHEREalts.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

          1. 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

            1. 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

              1. 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.NAMEFROMtara_alts,tara_mainsWHEREtara_alts.ID=tara_mains.AID) FROM tara_mainsJOINtara_altsONtara_mains.ID=tara_alts.MIDANDtara_alts.MID= (SELECTtara_alts.MIDFROMtara_altsWHEREtara_alts.NAME='heinrich')

                Hab aber auch schon ein neues Problem:
                DELETE tara_alts,tara_mainsFROMtara_alts,tara_mainsWHEREtara_alts.MID= (SELECTtara_alts.MIDFROMtara_altsWHEREtara_alts.NAME= 'heinrich') ANDtara_mains.ID= (SELECTtara_alts.MIDFROMtara_altsWHEREtara_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

                1. Tach!

                  DELETE tara_alts,tara_mainsFROMtara_alts,tara_mainsWHEREtara_alts.MID= (SELECTtara_alts.MIDFROMtara_altsWHEREtara_alts.NAME= 'heinrich') ANDtara_mains.ID= (SELECTtara_alts.MIDFROMtara_altsWHEREtara_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.

  2. 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