Ankündigung

Einklappen
Keine Ankündigung bisher.

Minimum filtern

Einklappen

Neue Werbung 2019

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

  • Minimum filtern

    Hallo Forum,

    schön, dass es ein solch gutes Forum gibt. Habe schon einige interessante Informationen gelesen!

    Ich bin php-Anfänger und benötige in meinem Programm Werte von einer Datenbank. In der Tabelle 'texte' sind die Spalten 'id', 'text_id' und 'position'.
    id ist eindeutig. Zu den text_ids gibt es mehrere Einträge. Und ich möchte zu jeder text_id den Eintrag mit dem jeweils niedrigsten Wert von "position" filtern.
    Unter anderem bei mysql.com im Referenzhandbuch habe ich gelesen, dass dafür GROUP und MIN() infrage kommen, und habe die SQL-Abfrage so gebaut:
    PHP-Code:
    $query "SELECT id, text_id, MIN(position)
                  FROM texte
                  WHERE text_id IN (
    $text_IDs_string)
                  GROUP BY text_id"

    (in $text_IDs_string stehen die text_id, die berücksichtigt werden sollen)
    Da wird allerdings nicht nach dem niedrigsten Wert von position gefiltert, sondern es wird nur der minimale Wert von position in der Gruppe zusätzlich ausgegeben.
    Das MIN muss also woanders hin. Aber wo?
    Wäre schön, wenn mir jemand dabei helfen könnte

  • #2
    Könntest du mir ein Beispiel geben, was genau du meinst.

    Und die Frage:
    PHP-Code:
    ...niedrigsten Wert von position gefiltertsondern es wird nur der minimale Wert von position... 
    Ist in dem Fall der minimale Wert, der aktuell niedrigste. Oder gibt es einen minimalen Wert, welcher nicht unterschritten werden darf und du willst hier nur prüfen, welcher der Datensätze dem minimalsten am nächsten kommt?
    Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

    Kommentar


    • #3
      ja minimalsten ist nicht so sinnig, sorry
      Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

      Kommentar


      • #4
        Ahoi,

        alles was im SELECT steht, ist das was du am Ende ausgegeben haben möchtest. Daher
        ist es unsinnig den minimalsten Wert von position im SELECT zu holen.
        So wie ich das sehe, brauchst du für dein Vorhaben ein SUBSLECT in der WHERE-KLausel in der du dir die postition holst. Das Problem dabei ist, das deine text_id aus einer Sammlung geholt wird. Das bedeutet also du brauchst einen JOIN aus der SUBSELECT auf deine MAINSELECT, mit der text_id in der ON-Klausel. Wie das nochmal ging müsste ich jetzt selbst erstmal wieder suchen und nachvollziehen.
        ------
        Grüße Manü

        Kommentar


        • #5
          Hallo Moewe,
          hier mal ein Beispiel, hoffe so ist es klarer:

          PHP-Code:
          Tabelle:
          id text_id position
          ---+---------+---------
          1  |    10   |   
          2  
          |    10   |   1
          3  
          |    10   |   3
          4  
          |    11   |   
          5  
          |    11   |   6
          6  
          |    12   |   1
          7  
          |    13   |   9
          8  
          |    13   |   5

          Das Ergenis des Filters soll sein
          :

          id text_id position
          ---+---------+---------
          2  |    10   |   1
          5  
          |    11   |   6
          6  
          |    12   |   1
          8  
          |    13   |   
          Es soll also von jeder text_id der Datensatz mit der niedrigsten position ausgewählt werden.
          (es kann auch noch sein, dass es davon mehrere gibt. dann soll es die mit der niedrigeren id sein. das kann aber in einem weiteren Schritt passieren)

          Kommentar


          • #6
            Obwohl wenn ich das so sehe, könnte es auch so funktionieren.
            PHP-Code:
            $query "SELECT id, text_id, position
                          FROM texte
                          WHERE text_id IN (
            $text_IDs_string)
                          GROUP BY text_id
                          ORDER BY position ASC"

            ------
            Grüße Manü

            Kommentar


            • #7
              fehlt dann nicht noch ein order auf die id?

              Kommentar


              • #8
                PHP-Code:
                SELECT idtext_idposition 
                FROM texte t 
                WHERE text_id IN 
                ($text_IDs_string
                AND 
                position = (SELECT Min(positionFROM texte WHERE text_id t.text_id
                GROUP BY text_id 
                [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                Kommentar


                • #9
                  * gelöscht * weil doppelt

                  Kommentar


                  • #10
                    Hallo,

                    vielen Dank für die Antworten. Die erste Version mit ASC funktioniert leider nicht.

                    Die zweite scheint zu funktionieren (hab ich noch nicht genau geprüft). Was ist das für eine Kontruktion mit diesem t?
                    FROM texte t
                    und t.text_id

                    Viele Grüße

                    Kommentar


                    • #11
                      Das ersetzt deine Tabelle "texte" und du kannst dann mit "t." auf "texte." zugreifen.. praktisch ein Platzhalter..
                      No Sacrifice , no Glory--

                      Kommentar


                      • #12
                        Zitat von stackoverflow Beitrag anzeigen
                        Hallo Moewe,
                        hier mal ein Beispiel, hoffe so ist es klarer:

                        PHP-Code:
                        Tabelle:
                        id text_id position
                        ---+---------+---------
                        1  |    10   |   
                        2  
                        |    10   |   1
                        3  
                        |    10   |   3
                        4  
                        |    11   |   
                        5  
                        |    11   |   6
                        6  
                        |    12   |   1
                        7  
                        |    13   |   9
                        8  
                        |    13   |   5

                        Das Ergenis des Filters soll sein
                        :

                        id text_id position
                        ---+---------+---------
                        2  |    10   |   1
                        5  
                        |    11   |   6
                        6  
                        |    12   |   1
                        8  
                        |    13   |   
                        Es soll also von jeder text_id der Datensatz mit der niedrigsten position ausgewählt werden.
                        (es kann auch noch sein, dass es davon mehrere gibt. dann soll es die mit der niedrigeren id sein. das kann aber in einem weiteren Schritt passieren)
                        Dann mach einfach select text_id, min(position) from ... group by text_id. Die erste ID-Spalte kannst Du so nicht ermitteln. Willst Du diese haben, so joine nochmals das Resultat gegen die Ausgangstabelle. Oder nehme PostgreSQL mit DISTINCT ON() - Erweiterung, dann geht das in einem Rutsch und viel schneller. Oder nehme die rank() - Funktion in PostgreSQL, Oracle, M$SQL, Informix oder oder oder - aber nicht MySQL, das kann das natürlich nicht.
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Das ist ein Alias und wird in diesem Subselect gebraucht damit die Datenbank unterscheiden kann von welcher Tabelle die Spalte kommt die verglichen wird.
                          PHP-Code:
                          .. WHERE id id .. // Fehlermeldung, wenn du aus 2 Tabellen selektierst in denen es das Feld id gibt
                          .. WHERE Tabellenalias1.id Tabellenalias2.id .. // no problemo 
                          Wenn du Joins oder Subselects einsetzt, sollte es nicht schaden Aliasse zu setzen
                          Idealerweise gibst du den Aliassen sinnvollere Namen
                          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                          Kommentar


                          • #14
                            Vielen Dank für die Antworten. Ich kann es im Augenblick nicht wirklich testen, weil in der Datenbank noch ein bug ist. Im Groben funktioniert es aber. Ich melde mich dann noch einmal.

                            Danke!!

                            Kommentar


                            • #15
                              Zitat von stackoverflow Beitrag anzeigen
                              weil in der Datenbank noch ein bug ist.
                              Daß Du MySQL verwendest geht schon aus #1 hervor. Keine andere Datenbank würde den Syntaxfehler in dem SQL übersehen, außer MySQL.
                              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                              Kommentar

                              Lädt...
                              X