GROUP BY auf 2 Feldern

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

  • GROUP BY auf 2 Feldern

    Ich versuche einen GROUP BY auf zwei Spalten. Allerdings will es nicht so wie ich möchte.

    GROUP BY wohn_wohnung_lang.WohnId, geodb_locations.adm1

    Die WohnId als auch adm1 darf nur einmal gelistet werden. Allerdings wird erst gar nicht nach adm1 gruppiert. Ich kann das letzte goed_locations.adm1 auch weglassen, es kommt das gleiche Ergebnis. Wieso?


    MfG Markus

  • #2
    CODE-Statement? Meine Glaskugel ist im Urlaub... !

    Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
    sondern mit den Augen das Manual zu lesen.

    Kommentar


    • #3
      Code:
      SELECT COUNT(*) AS wohnungen, geodb_adm0.KontId, geodb_adm0.adm0, geodb_adm0.name AS land, geodb_adm1.name, geodb_adm1.url FROM 
      wohn_wohnung LEFT JOIN wohn_show ON wohn_wohnung.WohnId = wohn_show.WohnId 
      LEFT JOIN wohn_rechnungsposten ON wohn_show.PostenId = wohn_rechnungsposten.PostenId 
      LEFT JOIN wohn_rechnung ON wohn_rechnungsposten.RechnungId = wohn_rechnung.RechnungId
      LEFT JOIN geodb_locations ON wohn_wohnung.LocationId = geodb_locations.id 
      LEFT JOIN wohn_wohnung_lang ON wohn_wohnung.WohnId = wohn_wohnung_lang.WohnId 
      LEFT JOIN geodb_adm0 ON geodb_adm0.adm0 = geodb_locations.adm0 
      LEFT JOIN geodb_adm1 ON geodb_adm1.adm1 = geodb_locations.adm1 AND geodb_adm1.adm0 = geodb_locations.adm0
      WHERE wohn_rechnung.BezahlDatum IS NOT NULL 
      AND wohn_show.Month = '2005-07-01' 
      AND geodb_adm0.url LIKE 'deutschland' 
      AND wohn_wohnung_lang.Lang IS NOT NULL 
      GROUP BY wohn_wohnung_lang.WohnId, geodb_locations.adm1 ORDER BY geodb_adm1.url
      MfG Markus
      Zuletzt geändert von markusschmitt; 06.07.2005, 18:24.

      Kommentar


      • #4
        Vermutlich weil es nichts mehr in deinem Ergebnis zu gruppieren gibt...?
        Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
        var_dump(), print_r(), debug_backtrace und echo.
        Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
        Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
        Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

        Kommentar


        • #5
          Doch es gibt noch was zu gruppieren, deshalb versteh ich ja nicht warum es nicht gemacht wird.

          http://www.wohn.mi-ernst.de/en/germany/index.html
          Es sollte hier noch nach baden-wuerttemberg gruppiert werden können.

          MfG Markus

          Kommentar


          • #6
            was ist den WohnID - eindeutige ID des jeweiligen objektes ...?


            (btw: du könntest in deinem beispiel mal auf mysql_fetch_assoc() umstellen, damit nicht jede eigenschaft doppelt auftaucht ...)
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Ja ist der PK. wohn_wohnung_lang hat den PK als FK. Da der Bug erst aufgetaucht ist, als ich eine Wohnung mit der Sprache Englisch ausgestattet hab, ist es mir vorher nicht aufgefallen. Das heisst sobald ich eine weitere Wohnung mit Englischer Sprache ausstatte bekomm ich eine weitere Wohnung im COUNT Ergebnis zurück, was natürlich falsch ist.

              Werde die DB Klasse verändern!

              MfG Markus

              Kommentar


              • #8
                setz mal ein EXPLAIN davor und schau dir an was da kommt (admin/konsole)

                OffTopic:
                eine Wohnung mit der Sprache Englisch
                Ich empfinde es beängstigend wenn Wohnungen in Schwaben sprechen können, besonders noch in Fremdsprachen ...

                chansel0049
                ----------------------------------------------------
                if you've reached the bottomline - dig further!
                Übersetzer gesucht? http://www.babelport.com

                Kommentar


                • #9
                  Tja, wir können alles außer Hochdeutsch! Das kann man auf unsere Wohnungen übertragen ;-)
                  Code:
                  mysql> EXPLAIN SELECT COUNT(*) AS wohnungen, geodb_adm0.KontId, geodb_adm0.adm0, geodb_adm0.name AS land, geodb_adm1.name_int
                   AS name, geodb_adm1.url_int AS url, wohn_wohnung.wohnid FROM
                      -> wohn_wohnung LEFT JOIN wohn_show ON wohn_wohnung.WohnId = wohn_show.WohnId LEFT JOIN wohn_rechnungsposten
                   ON wohn_show.PostenId = wohn_rechnungsposten.PostenId LEFT JOIN wohn_rechnung ON wohn_rechnungsposten.RechnungId = wohn_rechnung.RechnungId
                      -> LEFT JOIN geodb_locations ON wohn_wohnung.LocationId = geodb_locations.id LEFT JOIN wohn_wohnung_lang ON wohn_wohnung.WohnId =
                   wohn_wohnung_lang.WohnId LEFT JOIN geodb_adm0 ON geodb_adm0.adm0 = geodb_locations.adm0
                      -> LEFT JOIN geodb_adm1 ON geodb_adm1.adm1 = geodb_locations.adm1 AND geodb_adm1.adm0 = geodb_locations.adm0 WHERE
                   wohn_rechnung.BezahlDatum IS NOT NULL AND wohn_show.Month = '2005-07-01' AND geodb_adm0.url_int LIKE 'germany' AND wohn_wohnung_lang.Lang
                      -> IS NOT NULL GROUP BY geodb_locations.adm1,wohn_wohnung_lang.WohnId ORDER BY geodb_adm1.url_int;
                  +----------------------+--------+----------------+---------+---------+-------------------------------------------+------+----------------------------------------------+
                  | table                | type   | possible_keys  | key     | key_len | ref                                       | rows | Extra                                        |
                  +----------------------+--------+----------------+---------+---------+-------------------------------------------+------+----------------------------------------------+
                  | wohn_show            | ALL    | WohnId         | NULL    |    NULL | NULL                                      |   47 | Using where; Using temporary; Using filesort |
                  | wohn_wohnung         | eq_ref | PRIMARY        | PRIMARY |       4 | wohn_show.WohnId                          |    1 |                                              |
                  | wohn_rechnungsposten | eq_ref | PRIMARY        | PRIMARY |       4 | wohn_show.PostenId                        |    1 |                                              |
                  | wohn_rechnung        | eq_ref | PRIMARY        | PRIMARY |       4 | wohn_rechnungsposten.RechnungId           |    1 | Using where                                  |
                  | geodb_locations      | eq_ref | PRIMARY,id     | PRIMARY |       4 | wohn_wohnung.LocationId                   |    1 |                                              |
                  | wohn_wohnung_lang    | ref    | PRIMARY,WohnId | PRIMARY |       4 | wohn_wohnung.WohnId                       |    1 | Using where; Using index                     |
                  | geodb_adm0           | eq_ref | PRIMARY        | PRIMARY |       2 | geodb_locations.adm0                      |    1 | Using where                                  |
                  | geodb_adm1           | eq_ref | PRIMARY,adm0   | PRIMARY |       4 | geodb_locations.adm0,geodb_locations.adm1 |    1 |                                              |
                  +----------------------+--------+----------------+---------+---------+-------------------------------------------+------+----------------------------------------------+
                  8 rows in set (0.05 sec)
                  MfG Markus

                  PS: Werde das Posting verkleinern sobald es weitergeholfen hat, oder auch nicht!
                  Zuletzt geändert von markusschmitt; 07.07.2005, 20:47.

                  Kommentar


                  • #10
                    Beeindruckende Query ...

                    Was passiert denn, wenn Du mal
                    PHP-Code:
                    Select geodb_locations.adm1,wohn_wohnung_lang.WohnId 
                    FROM 
                    .... 
                    GROUP BY geodb_locations.adm1,wohn_wohnung_lang.WohnId 
                    Meine vermutung ist (und ich kann die Sache hier nur überfliegen) dass du innerhalb der SELECT Anweisung werte selektierts die innerhalb der Gruppierung liegen, und sie die Gruppierung "aufheben" ..

                    Ausserdem scheint mir
                    wohn_show.Month = '2005-07-01'
                    evtl. falsch zu sein (hängt von Datentyp und Inhalt der Month Column ab -- evtl (wohn_show.Month = date_format('2005-07-01',"%Y%m" )) aber das ist nur geraten
                    chansel0049
                    ----------------------------------------------------
                    if you've reached the bottomline - dig further!
                    Übersetzer gesucht? http://www.babelport.com

                    Kommentar


                    • #11
                      P.S. wieviele Zeilen erwartest du denn?
                      druch
                      wohn_show.Month = '2005-07-01' ... wohn_wohnung_lang.Lang IS NOT NULL
                      wird gemäß EXPLAIN ja bereits nur eine Zeile gefiltert
                      chansel0049
                      ----------------------------------------------------
                      if you've reached the bottomline - dig further!
                      Übersetzer gesucht? http://www.babelport.com

                      Kommentar


                      • #12
                        Also das mit dem Datum haut hin!

                        Ich mach das Statement mal kurz in einem Satz

                        Ich möchte die Anzahl alle Wohnungen pro Bundesland, bei denen die Rechnung für den aktuellen Monat bezahlt wurde und bei dem mindestens eine Sprache vorhanden ist!

                        Insgesamt gibt es 8 eingetragene Wohnungen. Eine aus Baden-Wuerttemberg wurde mit englischem Text ausgestattet. Das Ergebnis ist, dass Baden-Wuerttemberg jetzt eine Wohnung mehr bekommen hat, also statt 7 steht dort jetzt 8. Insgesamt sollten nur 2 Zeilen als Ergebnis kommen

                        Baden-Wuerttemberg (7)
                        Berlin (1)

                        MfG Markus
                        Zuletzt geändert von markusschmitt; 07.07.2005, 13:28.

                        Kommentar


                        • #13
                          Wenn Du die die Ausgabe von EXPLAIN anschaust siehst Du das jedoch nach dem Joinen bon wohn_show und wohn_wohnung nur noch eine Zeile da ist , also scheint entweder per JOIN Bedingung oder WHERE nur eine "durchzukommen"
                          chansel0049
                          ----------------------------------------------------
                          if you've reached the bottomline - dig further!
                          Übersetzer gesucht? http://www.babelport.com

                          Kommentar


                          • #14
                            Also
                            Code:
                            SELECT * FROM wohn_show WHERE  wohn_show.Month = '2005-07-01'
                            liefert mir insgesamt 8 Datensätze von 47! Das stimmt also. Ich vermute das Problem eher bei der Beziehung von wohn_wohnung zu wohn_wohnung_lang allerdings fällt mir nichts falsches auf.

                            MfG Markus

                            Kommentar


                            • #15
                              Es gibt nicht zufällig eine Funktion bei der man sagen kann, die WohnId darf nur einmal im Result beachtet werden. Durchsuch gerade erfolglos die Referenz.

                              MfG Markus

                              Kommentar

                              Lädt...
                              X