4 fragen betreffend joins

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 4 fragen betreffend joins

    Tach zusammen,
    Ich habe viel gelesen, fleissig geübt, doch bin ich auf 4 Fragen / Probleme gestossen, für die ich keine (befriedigenden) lösungen gefunden habe.

    1) Ich habe unterschiedliche Aussagen bzgl. dem Tempo zwischen einem Join via "where" und "join" gehört (in artikeln und foren) und auch selber bin ich nicht zu aussagekräftigen ergebnissen gekommen.
    Deswegen bitte ganz klar: wenn ich über zwei und mehr tables abfragen will, was ist schneller: ein select via "join" oder "where"?
    Beispiel mit hilfe der worlds-database von mysql.com:
    SELECT city.name City, country.name Country FROM country, city WHERE city.CountryCode = country.code
    SELECT city.name City, country.name Country FROM country JOIN city ON city.CountryCode = country.code
    SELECT city.name City, country.name Country FROM city JOIN country ON city.CountryCode = country.code

    Was ist besser, was ist schneller?

    2) Ich habe keine Antwort auf folgendes problem gefunden.
    Gegeben seien zwei tables t1 und t2.
    t1 hat felder id - vorname - name, t2 felder id - ref_t1 - strasse - zip - stadt - land (ref_t1 ist die referenz zu t1)
    So, was ich will, und ehrlich gesagt keinen plan habe wie ich das umsetzen soll (oder im moment einfach zu blind bin):
    Ich will alle datensätze aus t1 die keinen dazugehörigen datensatz in t2 haben.
    Folgendes habe ich bis dato gebastelt:

    SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.ref_t1

    Das bringt mir alle übereinstimmenden rows + die rows in t1 die keine entsprechende in t2 haben, sprich "NULL"

    Aber die Lösung des eigentlichen Problems…
    Ich trau mich erst gar keinen einen meiner versuche aufzuführen, da es zu viele waren.
    Ist sowas überhaupt lösbar?


    3) Suche nach einer Richtlinie
    Wenn man bei einem Join weitere Eingrenzungen vornehmen möchte, was wählt man dazu: "ON" oder "WHERE"?
    OK, die Frage sagt gar nichts.

    Wieder 2 tables, t1 & t2. beide will ich über ein feld id verknüpfen:
    SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id
    OK, hier hätte man auch "USING" verwenden können, aber darum geht’s ned.
    Nehmen wir an, ich will die auswahl auf einige IDs begrenzen, und alle datensätze sollen in deutsch sein (feld t2.language)
    Wie geht man vor :

    SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id AND t1.id IN (1,2,3) AND t2.language = 'deutsch'

    oder

    SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id WHERE t1.id IN (1,2,3) AND t2.language = 'deutsch'

    Gibt es da eine Richtlinie, Empfehlung, was nun besser ist? Und warum?

    4) So, und jetzt wird es für mich als neuling wirklich verzwickt, und ich suche nach einer besseren lösung.
    Ausgangssituation:

    Table: user, Felder: id
    Table: user_details, Felder: id, ref_user (referenz zum user-table), name, email
    Table: user_images, Felder: id, ref_user (referenz zum user-table), dateiname

    Soweit, so gut.
    Wie ich einen User mit seinen Details und einem Bild mittels einem Select bekomme ist klar (2 joins)
    Jetzt kommt nur das problem: ein user kann zwar nur einen entsprechenden datensatz in user_details haben, aber mehrere in user_images.

    Und hier weiß ich quasi nimma weiter.
    Mir ist eine Lösung bekannt:
    Man fragt in einem select nach user mit seinen details und in einem zweiten select nach den bildern und gibt sie dann in einer schleife aus.
    Doch das gefällt mir nicht.
    Mir ist auch eine weitere Lösung bekannt:

    SELECT u.id userID, d.id detailsID, im.dateiname FROM user u JOIN user_details d ON u.id = d.ref_user JOIN user_images im ON u.id = im.ref_user WHERE d.id = 3
    Dies ergibt dann ungefähr folgendes ergebnis:

    userID --- detailsID --- dateiname
    4 2 bild-01.jpg
    4 2 bild-02.jpg
    4 2 bild-03.jpg

    Doch ich kenne keine elegante lösung, um sowas nun per PHP in einen array zu überführen; habe mir ehrlich gesagt auch noch nicht so viele gedanken drüber gemacht, die daten zu gruppieren etc.

    Ich hoffe, die Problematik einigermassen rüber gebracht zu haben, und frage, was nun besser ist, vor allem wie man am besten die daten per PHP grupiert.


    Das wars mit meiner Fragerei. Ich bin für jegliche Inspiration sehr dankbar.

  • #2
    1. im pma ausprobieren ?
    2. schau dir das sticky hier im forum an "IS NULL" ist dein freund
    3. "WHERE" ... sag ich mal ganz frech
    4. stichwort "gruppenwechsel"
    - 1. id merken (hilfsvariable) und alles zusammenfassen, was dazu gehört
    - wechselt die id, kommt ein neuer datensatz, also hilfsvariable überschreiben und weitermachen

    ^^ das geht natürlich auch mehrfach verschachtelt
    Kissolino.com

    Kommentar


    • #3
      hmm würde sagen ich verwende Tabellenverknüpfungen wenn ich eine Relationelle DB haben will. Darunter verstehe ich weiterhin zumindest die drei Normalformen einzuhalten...
      [color=blue]MfG Payne_of_Death[/color]

      [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
      [color=red]Merke:[/color]
      [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

      Murphy`s Importanst LAWS
      Jede Lösung bringt nur neue Probleme
      Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
      In jedem kleinen Problem steckt ein großes, das gern raus moechte.

      Kommentar


      • #4
        zu 2.
        Code:
        SELECT t1.id, COUNT(t2.id) counted
          FROM t1
          LEFT JOIN t2
            ON t1.id = t2.ref_t1
         GROUP BY t1.id
        HAVING counted > 0
        könnte hilfreich sein ...

        zu 4. Tabellenentwurfstheorie ist komplex ... such mal via Google nach "normalisierung" oder "normalform" oder "boyce-codd" oder vielleicht auch nach "bcnf" (boyce-codd normalform) ...

        für alles andere kannst Du Dir leicht Testscenarios ausdenken ... und zeiten messen ... (mehrfach Messungen vornehmen da die moderen OS' multitasking-fähig sind und sich prozesse im Laufzeitverhalten beeinflussen) ...
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          Vielen Dank euch allen, DASS ihr mir geholfen habt, jetz muss ich's nur noch verstehen...

          @wurzel
          1) was ist ein/ eine "pma"?
          2) ich schaue mir ein "sticky" an - in der hoffnung dass er/ sie/ es tatsächlich meinen wissendurst stillt - welches sticky? was'n dat überhaupt? wo finde ich dieses sagenumwobene ding??
          (bevor hier jemand nen schreianfall steht - links ist zu lesen, ich sei ein newbie. dem habe ich nichts hinzuzufügen)
          4) das mit dem gruppenwechsel hört sich scharf an. aber ehrlich gesagt: ich habe jetzt keine so rechte ahnung wie ich deinen tip umsetzen soll.
          meinst de also in einem select alles auf einmal abfragen, und dann mit php per unterschleife auf die dateinamen (in diesem falle) zugreifen?
          wenn ja, dann alles klar. wenn nein - wie du meinen?

          @goth
          war nur ein etwas komplexeres beispiel für 1:n mit nem weiteren table um die geschichte zu vereinfachen. In wahrheit handelt es sich um einen kleinanzeigedatenbank, wo einige felder für die anzeigen verwendet werden, in einem weiteren table zusätzliche felder, wenn es sich bei einer anzeige um eine immobilienanzeige handelt, und eben ein table für bilder.
          aber ich werde mich dem thema normalisierung noch annehmen.
          vielen dank

          Kommentar


          • #6
            1. pma = phpMyAdmin = das zeug mit dem du sehr wahrscheinlich deine datenbank verwaltest

            2. sticky = die threads, die z. b. hier im forum ganz obenstehenund als wichtig markiert sind

            3. ich denke, du hast es richtig verstanden
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              zu 1: PhpMyAdmin
              zu 2: ein Sticky ist ein Thread, der immer oben am Eingang des jeweiligen Forums steht, in diesem Fall: JOINS - das leidige Thema
              zu 3: IMHO hast du verstanden, wei es geht. Sonst suche nach gruppenwechsel oder modulo.

              Kommentar


              • #8
                na dass du sooo "newbie" bist, kann ja keiner ahnen

                1. pma = phpMyAdmin
                ein tool, um mysql-datenbanken zu verwalten http://www.phpmyadmin.net/home_page/index.php

                2. "sticky" ist der "WICHTIG" post, direkt am anfang dieses forums
                http://www.php-resource.de/forum/sho...threadid=28292

                3. benutz mal die forumsuche ... das thema wird hier gerne genommen
                Kissolino.com

                Kommentar


                • #9
                  guten morgen zusammen,
                  möchte mich nur bei euch artig bedanken.
                  und jo klar, mit phpMyAdmin arbeite ich auch, nur "pma"...
                  und den beitrag zum leidigen thema "joins" hab ich schon rausgefischt, muchas gracias.
                  sonnige grüße

                  Kommentar

                  Lädt...
                  X