Abfrage mit GROUP_CONCAT und GROUP BY mag micht nicht.

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

  • #16
    Zitat von AmicaNoctis Beitrag anzeigen
    Du brauchst nur bands_tags.* im Select-Teil wegzulassen. Und im group_concat musst du natürlich alle_genres verwenden.

    Hab das soweit versucht, mit folgendem Ergebnis:

    Kommentar


    • #17
      Erstens: Der JOIN ist Blödsinn, ich sehe es aber jetzt erst:
      Code:
      ON alle_genres.tag = bands_tags.tag
      Das liefert dir doch genau dieselben. Es soll ja aber die liefern, die zur selben Band gehören. Also musst du über die Spalte band_id joinen, nicht über tag.

      Zweitens:
      Code:
      GROUP_CONCAT(DISTINCT ...)
      Damit erscheint jedes Genre nur einmal, auch wenn es dann vermutlich sowieso nur einmal auftauchen würde, aber ich kenne ja nicht deine komplette DB und deine späteren Abfrageabsichten. Also schadet es auch nicht.

      Drittens: Sieh dir das Telefonnummern-Beispiel nochmal ganz in Ruhe und ganz genau an, bis du es vollständig verstanden hast. Deine Herangehensweise ist noch etwas zu wild und zeugt von "Probieren über Studieren", was im DB-Umfeld nicht unbedingt zielführend ist.
      Zuletzt geändert von AmicaNoctis; 24.03.2010, 14:13.
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #18
        Ja, vielen vielen Dank soweit, ich sollte mir das mal in Ruhe anschauen und auch richtig verstehen.

        Mein Problem ist einfach, dass wir für unser Magazin derzeit keinen Programmierer haben und ich das umzusetzen versuche, was ich kann. So ist halt momentan die Situation, auch wenn sie nicht befriedigend ist.

        Kommentar


        • #19
          Supi, jetzt geht's:

          http://vampster.com/genres/example_g...modern%20metal
          Das klappt gut, da habe ich nur 5 Bands mit 2 Genres im Schnitt.


          Bei Dark Wave als Genre wird's schon holpriger:
          http://vampster.com/genres/example_g...re=dark%20wave

          54 passende Bands im Archiv -> Query braucht über 20 Sekunden.

          Bei anderen Genres, zu denen wir richtig viele Bands haben, läuft die Abfrage ins Nirwana.

          Die Abfrage dazu sieht so aus:
          Code:
          SELECT bands_master.name, bands_tags.band_id, bands_tags.naehe, 
          GROUP_CONCAT( " ", alle_genres.tag ) 
          FROM bands_tags
          JOIN bands_master ON bands_master.id = bands_tags.band_id
          JOIN bands_tags AS alle_genres ON alle_genres.band_id = bands_master.id
          WHERE bands_tags.tag = "dark wave"
          GROUP BY name
          ORDER BY name ASC
          Hast du eine Idee woran das liegen könnte?

          Vielen Dank & Gruß,
          Markus
          Zuletzt geändert von boxi123; 26.03.2010, 07:49.

          Kommentar


          • #20
            Sind deine Tabellen indiziert und wenn ja, wie?
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #21
              Zitat von AmicaNoctis Beitrag anzeigen
              Sind deine Tabellen indiziert und wenn ja, wie?
              Oh je du stellst mir Fragen..
              Kurze Erklärung: Der Quellcode und die Datenbank stammen ursprünglich nicht von mir. Ich lerne nun eben nach und nach, was ich für auftretende Probleme benötige.

              Dann schätze ich, sollte ich mich nun mal mit dem Indizieren beschäftigen.

              Kommentar


              • #22
                Zitat von boxi123 Beitrag anzeigen
                Dann schätze ich, sollte ich mich nun mal mit dem Indizieren beschäftigen.
                Schätze ich auch
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #23
                  Zitat von AmicaNoctis Beitrag anzeigen
                  Schätze ich auch
                  verdammt... von wegen "ich programmier mal kurz ein neues Feature"..

                  Na dann mach ich das mal

                  Kommentar


                  • #24
                    Hab folgendes getestet: Die Tabelle bands_master hat in der Spalte "name" (also der Band-Name) ein "Volltext" und ein "Index" erhalten, und die Tabelle bands_tags in der Spalte tag (die Genres) ebenso.
                    Query für "Dark Wave" braucht damit anstatt 20 Sekunden nur noch 0.3 Sekunden.

                    Bei anderen Abfragen dauert es aber noch zu lange
                    gothic metal -> 203 Bands -> 1.9s
                    thrash metal -> viele bands -> nirwana

                    War das Käse oder prinzipiell der Richtige Ansatz?

                    Kommentar


                    • #25
                      Volltext-Indizes gibt es doch in InnoDB gar nicht. Nutzt du etwa MyISAM? Das würde ich nochmal überdenken, schon aus Gründen der referentiellen Integrität. (Hat mit der Abfrageperformance aber jetzt nicht so viel zu tun.)

                      Wichtig sind in erster Linie mal Primärschlüssel und Indizes auf deine Pseudo-Fremdschlüssel-Spalten (MyISAM hat ja keine echten Fremdschlüssel). Außerdem macht es unter Umständen Sinn, weitere Spalten zu indizieren, die oft in Where-Klauseln verwendet werden.

                      Jedenfalls siehst du ja an der Verbesserung der Abfragezeit, dass du im Grunde auf dem richtigen Weg bist. Als Stichwort wäre noch EXPLAIN zu nennen, um das weiter zu optimieren.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #26
                        Danke!
                        Dann werkle ich mal weiter und melde mich mit neuen Erkenntnissen

                        Kommentar


                        • #27
                          Aus dem EXPLAIN werde ich noch nicht wirklich schlau.
                          Fürs Genre "Black Metal" benötigt die Abfrage bei 497 Bands 93 Sekunden, das EXPLAIN sagt mir folgendes:

                          Abfrage:
                          Code:
                          EXPLAIN SELECT bands_master.name, bands_tags.band_id, 
                          GROUP_CONCAT( " ", alle_genres.tag ) 
                          FROM bands_tags
                          JOIN bands_master ON bands_master.id = bands_tags.band_id
                          JOIN bands_tags AS alle_genres ON alle_genres.band_id = bands_master.id
                          WHERE bands_tags.tag = "black metal"
                          GROUP BY name
                          Das EXPLAIN-Ergebnis:
                          id select_type table type possible_keys key key_len ref rows Extra
                          1 SIMPLE bands_tags ref tag,band_id,tag_2 tag 100 const 488 Using where; Using temporary; Using filesort
                          1 SIMPLE bands_master eq_ref PRIMARY PRIMARY 3 vampster_01.bands_tags.band_id 1 Using where
                          1 SIMPLE alle_genres ref band_id band_id 4 vampster_01.bands_master.id 2 Using where

                          Kann ich nicht wirklich viel damit anfangen.

                          Kommentar


                          • #28
                            Das sieht so aus, als ob du noch keine Indizes hättest. Statt "using where" sollte (außer in der ersten Zeile) "using index" stehen.
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #29
                              Hm, eigentlich schon?!
                              die bands_tags hat jeweils über band_id, tag und naehe einen Index,
                              die bands_master hat auch Indexe.

                              alle_genres erzeuge ich durch den Join, da kann ich ja nichts indexieren?

                              Ah, okay, hatte bei der bands_master wohl doch noch nicht richtig indexiert.

                              Hab mich von der Meldung "The following indexes appear to be equal and one of them should be removed" abschrecken lassen.
                              Jetzt hab ich diese Meldung, dafür schnurrt aber die Abfrage?!
                              Zuletzt geändert von AmicaNoctis; 26.03.2010, 15:39. Grund: Doppelpost

                              Kommentar


                              • #30
                                Zeig mal bitte die CREATE TABLE Statements.
                                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                                Super, danke!
                                [/COLOR]

                                Kommentar

                                Lädt...
                                X