Announcement

Collapse
No announcement yet.

GROUP_CONCAT - Optimierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GROUP_CONCAT - Optimierung

    Moin, moin!

    Nutze folgende SELECT:
    PHP Code:
    $result mysql_query("SELECT *,GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von, '-' ,HNr_bis,HNrZ_bis SEPARATOR ' / ') AS Gesamtvar FROM DB .... GROUP BY tb.id 
    Damit werden die Straßennamen mit Hausnummern gelistet. Doch nun haben aber nicht alle Häuser Hausnummern von bis, sondern eben nur einfach eine Nummer.
    Ich würde gerne, sofern es nur eine einfache Hausnummer gibt, CONCAT dazu bringen alles ab dem Bindestrich zu ignorieren.

    Habe da in den Manuel's :-) zwar was von CONCAT_WS gelesen doch nichts von GROUP_CONCAT_WS.

    Gibt es für mich noch Hilfe?

    Grüße Franz
    Zuletzt editiert von FraHa; 24.06.2009, 08:38.

  • #2
    Erledigt - Optimierung GROUP_CONCAT

    Moin, moin!

    Komme mir schon fast albern vor, dass ich meine eigenen Fragen beantworte.
    Aber vielleicht kann's jemand gebrauchen.

    ZU GROUP_CONCAT konnte ich nichts weiter finden, dass mein angesprochenes Anliegen mit CONCAT direkt zu lösen sei.
    Aber so, aus eins mach zwei, geht's auch:

    PHP Code:
    ... GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von ORDER BY Level DESC,Strasse ASC SEPARATOR ' / ') AS Gesamtvar
    GROUP_CONCAT(HNr_bis,HNrZ_bis ORDER BY Level DESC,Strasse ASC SEPARATOR '') AS Gesamtvar2 ... 
    und bei der Ausgabe einfach auf
    PHP Code:
    ... {if !empty($row['Gesamtvar2'])} - {$row['Gesamtvar2']}{/if}... 
    prüfen.

    Grüße Franz

    Comment


    • #3
      Zweite Ansatz doch keine Lösung

      Leider hat der Ansatz mit den beiden GROUP_CONCAT einen Fehler, den ich leider erst jetzt bemerkt habe.

      Hat die erste "Strasse" eine von bis Hausnummer und die letzte "Strasse", in dem selben DS, keine bis Hausnummer, so wird die bis Nummer der ersten "Strasse" der letzten "Strasse" zugeordnet.
      ?????????

      Grüße Franz

      Comment


      • #4
        Hallo,

        wie wäre es denn mit einem Union Select, in dem Du die einzelnen und die bis Hausnummern getrennt abfragst und dann die Spalten entsprechend sortierst.

        Gruß
        docendo discimus

        Comment


        • #5
          Originally posted by frauwue View Post
          Hallo,

          wie wäre es denn mit einem Union Select, in dem Du die einzelnen und die bis Hausnummern getrennt abfragst und dann die Spalten entsprechend sortierst.

          Gruß
          Vielen Dank für den Hinweis!
          Soweit ich mich erinnere müssen aber bei UNION SELCT's beide SQL Statements die selbe Anzahl von Werten und Feldtypen zurückgeben. Dem zur Folge würde als Ergebnis in meinen beiden Ergebnis-Variablen, $Gesamtvar und auch $Gesamtvar2, sowohl als auch die Hausnummern von bis stehen und ich wieder auf das ursprüngliche Problem, mit dem Bindestrich, komme.

          Grüße Franz

          Comment


          • #6
            Hi,

            es kommt doch nur darauf an, wie Dein Ergebnis aussieht. Bei den bis Hausnummern fügst Du sie mit Concat zu einer Ergebnisspalte zusammen. Bei den einzelnen gibst Du in der entsprechenden Spalte nur die einzelne Hausnummer aus; das Ergebnis muss natürlich derselbe Typ sein wie die zusammengesetzte. Die Unterscheidung machst Du in den where Bedingungen Deiner beiden Selects.

            Gruß
            docendo discimus

            Comment


            • #7
              UNION SELECT keine Lösung

              Habe eben die UNION SELECT zusammen gesetzt, mit Unterscheidung in der WHERE CLAUSE und CONCAT ist einmal gekürzt um den Bindestrich und die bis Hausnummer.
              Jetzt werden erst die Strassen mit bis Hausnummern gelistet und danach nur die Strassen mit von Hausnummer. Des Weiteren zeigen die DS mit mehreren Strassen diese nicht mehr alle an, weshalb überhaupt GROUP_CONCAT verwendet wird.


              PHP Code:
              $result mysql_query("SELECT *,GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von, '-' ,HNr_bis,HNrZ_bis ORDER BY Level DESC,Strasse ASC SEPARATOR ' / ') AS Gesamtvar FROM (DB) INNER JOIN tb2 ON (tb1.id = t2.id) WHERE tb2.HNr_bis != '' AND ... GROUP BY tb1.id UNION SELECT *,GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von ORDER BY Level DESC,Strasse ASC SEPARATOR ' / ') AS Gesamtvar2 FROM (DB) INNER JOIN tb2 ON (tb1.id = t2.id) WHERE tb2.HNr_bis = '' AND ... GROUP BY tb1.id ") or die(mysql_error()); 
              Hmm..

              Hatte auch schon überlegt zwei SELECT anzulegen und je nachdem ob die bis Hausnummer vorhanden ist oder nicht mit IF ELSE zu arbeiten. Ob das noch eine Idee ist.

              Gruß

              Comment


              • #8
                Hi,

                ehrlich gesagt, das ist mir etwas zu verworren, ohne das Datenmodell zu kennen.
                Hilfreich wäre auch für den Leser,den Select ohne Prozedur-Code aufzuschreiben.
                Ich kann dazu nur soviel sagen: Beim zweiten Select muss man UNION ALL SELECT schreiben, um alle Datensätze zu bekommen.
                Außerdem sollte die Sortierung für beide Selects gemeinsam nach dem letzten Select kommen, in der Form Order by 1 (d. h. :Sortiere beide Selects gemeinsam nach der ersten Spalte) . Warum Du 2-mal Straße innerhalb eines SELECTS abfragst, verstehe ich auch nicht.

                Gruß
                docendo discimus

                Comment


                • #9
                  Originally posted by frauwue View Post
                  Hi,

                  Warum Du 2-mal Straße innerhalb eines SELECTS abfragst, verstehe ich auch nicht.

                  Gruß
                  Nah, das hängt mit dem GROUP_CONCAT zusammen!

                  Gruß Franz

                  Comment


                  • #10
                    Hi,

                    jetzt habe ich gesehen, dass sie zweite Straße im ORDER BY steht, sorry. Aber das liegt an Deiner unübersichtlichen Schreibweise. Den SQL hatte ich mir in etwa so vorgestellt:

                    SELECT strasse,hnr1,concat('-',hnr2) from tabelle where hnr2 is not null
                    UNION ALL
                    SELECT strasse,hnr1,hnr2 from tabelle where hnr2 is null
                    ORDER BY 1,2

                    Gruß
                    Zuletzt editiert von frauwue; 26.06.2009, 00:00. Reason: verschrieben
                    docendo discimus

                    Comment


                    • #11
                      Lösung Optimierung GROUP_CONCAT

                      Vielen Dank an frauwue, für die Anregungen und Vorschläge!

                      Die Lösung liegt bei LENGHT:
                      PHP Code:
                      $result mysql_query("SELECT *,IF(LENGTH(HNr_bis),
                      GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von, '-' ,HNr_bis,HNrZ_bis ORDER BY Level DESC,Strasse ASC SEPARATOR ' / '),
                      GROUP_CONCAT(Strasse,' ',HNr_von,HNrZ_von ORDER BY Level DESC,Strasse ASC SEPARATOR ' / ')) AS Gesamtvar 
                      FROM (DBTa) INNER JOIN t2 ON (DBTa.id = t2.id) WHERE ... GROUP BY DBTa.id LIMIT 
                      $start$stop") or die(mysql_error()); 
                      Mit LENGHT prüfe ich erst, ob überhaupt ein Zeichen im Feld vorhanden ist.

                      Grüße und schönes Wochenende Franz

                      Comment

                      Working...
                      X