Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Frage zu JOIN Befehl und dem Auslesen desselben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Frage zu JOIN Befehl und dem Auslesen desselben

    Hi,

    ich hätt noch einmal eine frage zum JOIN Befehl -

    folgenden Befehl habe ich

    PHP-Code:
    $sql " SELECT * FROM sa_page_text INNER JOIN ( sa_page_code, sa_page_links) ON (sa_page_code.pageid = $pid AND sa_page_links.pageid = $pid) WHERE sa_page_text.pageid = $pid "
    Das klappt soweit ganz gut, nur würde ich die sich daraus ergebenden zeilen auch ordnen, was über die column "position", die jede der 3 gejointen tabellen besitzt, funktionieren soll.
    D.h. jeder Datensatz hat eine zugewiesene Nummer die sich geordnet durchzieht (nicht den primary-key) im feld "position".

    ein normales "ORDER BY position DESC" geht aber nicht, da er ausgibt, die Column "position" wäre "ambiguous", also mehrdeutig.

    Daher stellt sich die Frage, ob ich das Problem durch eine kleine Änderung beheben kann, oder die Datenbankstrukur verändern muss.

    Die zweite Frage ist wie folgt:

    Lese ich nun die sich daraus ergebende Tabelle mit einer While Schleife aus, bekomme ich zwar ein Ergebnis, nur gibt er mir statt der z.B.: 5 Zeilen dann 12 aus (also mehrere doppelt & dreifach).
    Ist es überhaupt möglich eine SQL JOIN Abfrage in einer WhileSchleife auszulesen?

    Code hierzu wäre
    PHP-Code:
    $select_query mysql_query($sql);

    while (
    $select_array mysql_fetch_array($select_query)) {

        
    $type $select_array['type'];

          if ( 
    $type "text" ) {
              include(
    'templates/block_templates/text.php');
          }

          if ( 
    $type "links" ) {
              include(
    'templates/block_templates/links.php');
          }

          if (
    $type "code" ) {
              include(
    'templates/block_templates/code.php');
          } 
    (Er soll also je nach typ - Link, Text, oder Code - eine andere Datei einbinden bis die Zeilen abgearbeitet sind)


  • #2
    Zu Frage 1) Wenn du gleichnamige Attribute hast, dann musst du diese über den Tabellennamen referenzieren, hier kannst du für Tabellen auch Aliase wählen. In deinem Fall z.B. sa_page_code.position

    Zu Frage 2) PHP ist es völlig schnurz durch welchen SQL Befehl die Daten kommen. Wenn du 12 Zeilen hast aber nur 5 erwartet hast, wirst du vermutlich einen falschen Query zusammen gebaut haben. Ich persönlich habe noch nie ein JOIN in der Form JOIN (tabelle1, tabelle2) gesehen. Vielleicht tüftelst du da noch mal dran rum. Außerdem führt z.B. ein INNER JOIN auch dazu, dass JEDER Datensatz aus der Tabelle auf der linken Seite angezeigt wird, egal, ob es in der rechten Tabelle einen entsprechenden, über ON verglichenen Datensatz gibt. Und da weiß ich noch viel weniger, wie sich deine Art des JOINS verhält.
    Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
    Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)

    Kommentar


    • #3
      Zitat von dennis81 Beitrag anzeigen
      [...] z.B. ein INNER JOIN auch dazu, dass JEDER Datensatz aus der Tabelle auf der linken Seite angezeigt wird, egal, ob es in der rechten Tabelle einen entsprechenden, über ON verglichenen Datensatz gibt. [...]
      Die Form habe ich auch noch nicht gesehen, jedoch selektiert MySQL nur dann einen Eintrag mit INNER JOIN, wenn zu diesem eine entsprechung in jeder mit INNER JOIN gejointen Tabelle gefunden wird.

      Kommentar


      • #4
        Er meint wohl nen LEFT JOIN
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Ähm schau dir mal deine IF Teile an
          PHP-Code:
           if ( $type "text" ) {
                    include(
          'templates/block_templates/text.php');
                }

                if ( 
          $type "links" ) {
                    include(
          'templates/block_templates/links.php');
                }

                if (
          $type "code" ) {
                    include(
          'templates/block_templates/code.php');
                } 
          fällt dir da nichts auf?

          Kommentar


          • #6
            Hallo,

            Bei einem Vergleich musst du doppelte Gleichheitszeichen (==) verwenden, da sonst eine Zuweisung in der Bedingung der if statt findet, was zur Folge hat, dass die Bedingung immer "true" ist.

            mfg Timo
            Me on GitHub
            Perfect vim configuration
            MAC Adress faker

            Kommentar


            • #7
              Debugging:Standardfehler - PHP.de Wiki
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Danke erstmal für die Ratschläge und Links - das mit dem "==" ist ja peinlich :S

                Zu
                Zitat von dennis81 Beitrag anzeigen
                Zu Frage 1) Wenn du gleichnamige Attribute hast, dann musst du diese über den Tabellennamen referenzieren, hier kannst du für Tabellen auch Aliase wählen. In deinem Fall z.B. sa_page_code.position
                Das wäre mir klar, aber ich habe die 3 Tables sa_page_text, -links, -code und in jeder dieser, die spalte position in der sich eine fortlaufende nummer befindet.

                d.h. in sa_page_text befindet sich die zeile mit position 1, in links die nummer 2 & in code die nummer 3 - und danach soll er ordnen


                Und dann noch eine Frage zum JOIN - ist in diesem fall ein INNER oder LEFT JOIN besser?

                Kommentar


                • #9
                  Das kommt darauf an, welches Ergebnis man erreichen will. Was ist besser auf dem Kuchen - Kirschen oder Erdbeeren?
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    ok, ich habe mein problem mit dem join gelöst - denn es war der JOIN an sich

                    Verwende nun einfach eine SELECT Abfrage mit UNION, hierzu aber noch eine letzte frage;

                    ist es irgendwie möglich, dass die Felder in den 3 verschiedenen tables verschiedene namen haben und ich sie trotzdem aufrufen kann??

                    Kommentar


                    • #11
                      ist es irgendwie möglich, dass die Felder in den 3 verschiedenen tables verschiedene namen haben und ich sie trotzdem aufrufen kann??
                      Bitte eine verständliche Frage stellen.
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Zitat von apo Beitrag anzeigen
                        ist es irgendwie möglich, dass die Felder in den 3 verschiedenen tables verschiedene namen haben und ich sie trotzdem aufrufen kann??
                        RTFM: „The column names from the first SELECT statement are used as the column names for the results returned.”

                        Kommentar

                        Lädt...
                        X