Ankündigung

Einklappen
Keine Ankündigung bisher.

select über 2 Tabellen und 3 Felder

Einklappen

Neue Werbung 2019

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

  • select über 2 Tabellen und 3 Felder

    Frohe Weihnachten euch allen nachträglich.

    Habe anscheinend schon zu lange davor gesessen und bin auch nur Hobbyprogrammierer.

    Mit folgendem Befehl erhalte ich nicht die gewünschte Ausgabe:

    Code:

    Code:
    SELECT *
    FROM artikel_stories, artikel_topics
    WHERE
    title LIKE '%abba%'
    OR hometext LIKE '%abba%'
    OR bodytext LIKE '%abba%'
    AND topicid = topic_id
    GROUP BY storyid order by title asc
    In der Ausgabe (siehe Anhang) stimmen topicid und topic_id nicht überein.
    Daher wird auch topic_title falsch ausgegeben.

    Kann mir Jemand helfen?

    LG, Chris

    PS: Leider kann ich kein JPG hochladen. Kommt die Meldung das die Abmessung 1024 x 0 sein muss.

  • #2
    was soll das GROUP BY bewirken? Nenne alle Spalten und kein *, verwende expliziete JOIN-Syntax.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Und bei mehreren AND/OR schadet es nicht zu klammern, alleine schon wegen der Lesbarkeit und Auswertung durch die DB.

      Bitte für SQL die Code-Tags hier im Forum nutzen, danke!
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Hallo akretschmer,

        wie ich bereits schrieb bin ich nur Hoppyprogrammierer.

        GROUP BY verwende ich damit ich nicht mehrfach das gleiche Ergebnis erhalte.

        Wenn ich statt * die Spalten angeben ist das Ergebnis das Gleiche.

        Die Join Syntax verstehe ich leider nicht, wo ist der Unterschied zur Trennung mit Komma?

        LG, Chris

        Kommentar


        • #5
          SELECT * und GROUP BY ist aber eine ungültige Syntax. Jedes Feld das im SELECT steht muss entweder auch im GROUP BY stehen oder in einer Aggregatfunktion genutzt werden (MAX(), AVG(), ...).

          Im SELECT zählt man explizit immer nur die Felder auf, die man dann im Ergebnis auch tatsächlich haben will.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Habe es geändert, aber die Ausgabe bleibt gleich.

            Code:
            SELECT title, hometext, bodytext, storyid, topicid, topic_id, created, topic_title  FROM artikel_stories, artikel_topics WHERE title LIKE '%$_POST[suche]%' OR hometext LIKE '%$_POST[suche]%' OR bodytext LIKE '%$_POST[suche]%' AND artikel_stories.topicid = artikel_topics.topic_id GROUP BY storyid order by title asc

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              Jedes Feld das im SELECT steht muss entweder auch im GROUP BY stehen oder in einer Aggregatfunktion genutzt werden (MAX(), AVG(), ...).
              Code:
              SELECT title, hometext, bodytext, storyid, topicid, topic_id, created, topic_title FROM ...
              GROUP BY storyid ...
              Fällt dir was auf?

              Welches DB-Ergebnis willst du denn haben?
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Hallo Hausi,

                erstmal danke für deine Geduld.

                Wenn ich alle Felder aus dem select auch bei GROUP By reinpacke erhalte ich die gleiche Ausgabe wie ohne GROUP BY

                Welches Ergebnis?
                Das habe ich in einem JPG das ich hier leider nicht hochladen kann.

                Mal sehen ich ob das so einfügen kann?
                180 ABBA 1161459367 1972 treffen sich Björn Ulvaeus und Benny Andersso... [img]http://www.personalbit.de/images/abba-artikel... 655 12 2 Gerichtsurteile
                2712 Kündigung – Schwerbehinderung unbedingt angeben 1294581658 Ihre Schwerbehinderung hatte Uta S. ihrem Chef ver... 372 2 2 Gerichtsurteile
                189 Sandra 1161463269 Sandra Cretu
                <b>Geboren:</b> 18. Mai 1962 in Saar...
                [img]http://www.personalbit.de/images/sandra-artik... 980 12 12 Die 80er Jahre

                Kommentar


                • #9
                  Versuch mal sowas, musst noch die Aliase anpassen, also je nachdem welche Tabelle es betrifft, das t. oder s. davor.
                  Und den Suchbegriff für das SQL ist auch noch zu fixen, du hast eine SQL-Injection Lücke. Am besten Prepared Statments verwenden. Welche DB-Verbindung nutzt du in PHP? PDO, mysqli_ ... ?

                  PHP-Code:
                  $suche $_POST["suche"];  // SQL-Escaping fahlt noch .. nicht vergessen je nach DB-Verbindung 
                  PHP-Code:
                  $sql "

                      SELECT
                          s.title, s.hometext, s.bodytext, s.storyid, s.created
                          t.topicid, t.topic_title

                      FROM
                          artikel_topics t


                      INNER JOIN
                        artikel_stories s ON s.topicid = t.topic_id

                      WHERE
                          s.title LIKE '%
                  $suche%' OR s.hometext LIKE '%$suche%' OR s.bodytext LIKE '%$suche%'

                      ORDER BY
                          s.title ASC

                  "

                  Das ist hier getippt, sicher nicht ganz korrekt und ich kenne deine DB nicht. Aber als Ansatz für dich dürfte das reichen.
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Bilder will hier auch niemand, solange es um Code und SQL geht.

                    So sollte es bei Dir funktionieren (die Hinweise dazu wurden alle schon geliefert):
                    Code:
                    SELECT title,
                           hometext,
                           bodytext,
                           storyid,
                           topicid,
                           topic_id,
                           created,
                           topic_title
                      FROM artikel_stories, artikel_topics
                     WHERE artikel_stories.topicid = artikel_topics.topic_id  --< join condition
                       and (                                                  -- Or Clause geklammert,
                           title LIKE '%$_POST[suche]%'                       --   sonst besteht die Gefahr der Vermischung
                        OR hometext LIKE '%$_POST[suche]%'                    --   mit anderen Kriterien
                        OR bodytext LIKE '%$_POST[suche]%'
                           )
                     -- GROUP BY storyid                                      -- Group niemals ohne Aggregat in der Select clause
                     order by title
                    Klammerung: Ob Hobby oder Beruf, die Bedeutung der Klammerung musst Du Dir aneignen.
                    Group By: Ein fortwährendes Jammerthema bei mySQL Nutzern. (Fast*) Nur in diesem Datenbanksystem kann man solche Statements wie Deins überhaupt aufrufen, ohne einen Fehler zu bekommen.
                    JOIN: Es gibt (auch in mySQL) eine explizite Syntax für das joinen von Tabellen. Sie ist mächtiger als Deine Variante und sicherer vor Falschbenutzung. Lesen, verstehen!

                    * SQLite ist ein ähnlicher Fall

                    p.s.: Hab hausl 's Antwort nicht mitbekommen, sein Statement enthält die zu bevorzugende JOIN Syntax, man sieht sofort die angenehmen Effekte!..

                    Kommentar


                    • #11
                      Hallo Perry,

                      dein Code hat direkt gepasst.
                      Mit dem Code von Hausi kam ich leider nicht klar.

                      Vielen lieben Dank euch Beiden, auch für die Hinweise auf Sicherheitslücken.
                      Aber die Daten sind nur auf meinem eigenen Webserver der von außen nicht erreichbar ist.

                      LG, Chris

                      Kommentar


                      • #12
                        Aber die Daten sind nur auf meinem eigenen Webserver der von außen nicht erreichbar ist.
                        Das gilt nicht, das ist auch eine Fehlerquelle wegen Syntaxüberschneidungen. Wenn du zB einen "O'Brian" (Hochkomma) irgendwo hast oder einen Titel mit "100%" (Prozentzeichen) dann kracht es. Man muss immer(!) den Kontextwechsel zur entsprechenden Syntax hin korrekt behandeln. Und hier ist es eben PHP -> SQL.
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Zitat von chris47803 Beitrag anzeigen
                          Mit dem Code von Hausi kam ich leider nicht klar.
                          Das ist aber der bessere Code, besser lesbar und er ist genauso lauffähig wie mein Statement. Was "kommt da nicht klar"?

                          Kommentar


                          • #14
                            Ich verstehe nicht was ich mit dem s und t machen muss. Nach meinem Verständnis passt es so.

                            Kommentar


                            • #15
                              Zitat von hausl Beitrag anzeigen
                              Versuch mal sowas, musst noch die Aliase anpassen, also je nachdem welche Tabelle es betrifft, das t. oder s. davor.
                              Hatte ich eigentlich extra erwähnt. Das sind Aliase um kurz und überslichtlich konkrete Spalten anzusprechen. Und vor allem wenn man doppelte Namen hat (in mehr Tabellen) eine Eliminierung der Fehlerquelle.

                              https://www.w3schools.com/sql/sql_alias.asp


                              Code:
                              artikel_topics t
                              ...
                              artikel_stories s
                              Kurzform für

                              Code:
                              artikel_topics AS t
                              ...
                              artikel_stories AS s
                              The string "()()" is not palindrom but the String "())(" is.

                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X