Abfrage mit GROUP_CONCAT und GROUP BY mag micht nicht.

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

  • Abfrage mit GROUP_CONCAT und GROUP BY mag micht nicht.

    Hallo,

    ich komme mit einer mySQL-Abfrage nicht weiter, vielleicht könnt ihr mir einen Tipp geben, was ich falsch mache.

    Aufgabe: ich sammle Musik-Gruppen aus einer Tabelle und die jeweils dazu hinterlegten Musik-Genres aus einer zweiten Tabelle. Die einzelnen Genres jeder Band werden durch das GROUP_CONCAT als Komma separierte Liste angezeigt.

    Ausgabe:
    http://vampster.com/genres/example_genres3.php

    Die dazugehörige Abfrage:
    Code:
    SELECT name, band_id, tag, naehe,GROUP_CONCAT(tag ORDER BY tag)
    FROM bands_tags LEFT JOIN bands_master ON bands_tags.band_id = id 
    GROUP BY name ORDER BY name ASC,naehe DESC
    (Bezeichnungen:
    name: Bandname
    band_id: Band ID
    tag: Genre-Bezeichnung
    naehe: Gewichtung -> 10 = niedrige Übereinstimmung von Band zu Genre, 100 = hohe Übereinstimmung.

    aus der tabelle bands_master und dem LEFT JOIN hole ich den bandnamen passend zur band_id.)


    Nun möchte ich aber gerne nach den Genres Filtern. Mein Ansatz geht leider nicht:

    2. Abfrage:


    PHP-Code:
    if (isset($genre)) {
    $query "SELECT name, band_id, tag, naehe,GROUP_CONCAT(tag ORDER BY tag) 
    FROM bands_tags LEFT JOIN bands_master ON bands_tags.band_id = id 
    WHERE tag =\""
    .$genre."\" GROUP BY name 
    ORDER BY name ASC,naehe DESC;"
    ;

    Ausgabe (Beispiel):
    http://vampster.com/genres/example_g...rnative%20rock

    Es wird also nur das eine Genre angezeigt, nach dem ich in der URL filtere. Mein Ziel wäre, auch die anderen Genres angezeigt zu bekommen, wenn zur Band weitere Einträge vorhanden sind.

    Kann mir jemand helfen?

    Vielen Dank schonmal,
    Markus

    PS: Der Server läuft noch mit mySQL 4.1.25, falls das wichtig ist.
    Zuletzt geändert von boxi123; 23.03.2010, 23:04. Grund: Code Tags + Erläuterungen hinzugefügt

  • #2
    Zitat von boxi123 Beitrag anzeigen
    WHERE tag =\"".$genre."\" group by name
    Wenn ich das so lese, kann das ja auch nicht wirklich gehen. Du sagst ja der DB das er nur die Datensätze haben soll, welche dieses Tag beinhalten. woher soll die DB denn wissen das du dennoch mehr willst. Oder habe ich deinen Post falsch interpretiert ?
    Zuletzt geändert von ronronron3005; 23.03.2010, 18:20. Grund: Deutsche Sprache, schwere Sprache
    Wozu brauchen wir Kraftwerke, wenn der Strom aus der Steckdose kommt.

    Kommentar


    • #3
      Hallo,

      kannst du bitte den Code mit den entsprechenden Tags formatieren und die benutzten Tabellen- und Spaltennamen erläutern? Dann kann man dir gezielter helfen.

      Gruß,

      Amica
      [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


      • #4
        Dreh mal dein Error Reporting auf. Das hier ist nämlich Käse:
        PHP-Code:
        $genre $_GET["genre"];
        if (isset(
        $genre)) {
            
        // ...

        Kommentar


        • #5
          Zitat von ronronron3005 Beitrag anzeigen
          Wenn ich das so lese, kann das ja auch nicht wirklich gehen. Du sagst ja der DB das er nur die Datensätze haben soll, welche dieses Tag beinhalten. woher soll die DB denn wissen das du dennoch mehr willst. Oder habe ich deinen Post falsch interpretiert ?
          ich bin davon ausgegangen, dass ich das mit dem
          Code:
          GROUP_CONCAT(tag ORDER BY tag)
          erreiche. Der Gedanke war, suche alle Eintrage, die das Genre "$genre" beeinhalten und zeige dann noch die weiteren Genres zu dieser Band. Habe das GROUP_CONCAT bisher noch nie verwendet, verwende ich es falsch?

          Kommentar


          • #6
            Zitat von AmicaNoctis Beitrag anzeigen
            Hallo,

            kannst du bitte den Code mit den entsprechenden Tags formatieren und die benutzten Tabellen- und Spaltennamen erläutern? Dann kann man dir gezielter helfen.

            Gruß,

            Amica

            Ok, so?

            Gruß,
            Markus

            Kommentar


            • #7
              Zitat von boxi123 Beitrag anzeigen
              Ok, so?
              Jep, danke.

              Da musst du wohl nochmal auf bands_tags joinen, also einmal bands_tags verwenden, um das Ergebnis einzugrenzen, darüber auf die Bands joinen und von dort nochmal auf bands_tags (mit Alias), um darauf das group_concat anzuwenden.

              Wenn du nur einmal bands_tags verwendest, wird es durch die Where-Klausel beschränkt, wie /(ron)+3005/ schon sagte.

              Gruß,

              Amica
              [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


              • #8
                Danke schön! Werde das morgen früh mal ausprobieren.
                Dann mal schauen, ob ich es kapiert habe

                Gruß,
                Markus

                Kommentar


                • #9
                  Hallo Amica,

                  ich muss nochmal nachfragen, weil ich nicht weiter komme: Die WHERE-Klausel fliegt raus, und dafür kommt ein zweiter JOIN rein, der die zusätzlichen Genres abfragt?
                  Steh wohl auf dem Schlauch.

                  Danke & Gruß,
                  Markus

                  Kommentar


                  • #10
                    Nein, die Where-Klausel bleibt und filtert immer noch das Genre raus, nach dem gesucht werden soll. Sonst würde das ja an der Aufgabenstellung vorbei gehen.

                    Hier mal ein Beispiel:

                    Code:
                    select
                        person.first_name,
                        person.last_name,
                        phone2.country_code,
                        phone2.area_code,
                        phone2.number,
                        phone2.extension
                    from phone as phone1
                    join person on person.id = phone1.person_id
                    join phone as phone2 on phone2.person_id = person.id
                    where phone1.country_code = 49
                        and phone1.area_code  = 172
                        and phone1.number     = 1234567
                        and phone1.extension is null
                    Findet alle Telefonnummern der Person, welche auch die Telefonnummer +49 172 1234567 besitzt. Über phone1 wird nur gefiltert und die Person rausgesucht. Die Telefonnummern im Ergebnis stammen dagegen aus phone2.
                    Zuletzt geändert von AmicaNoctis; 24.03.2010, 12:57.
                    [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


                    • #11
                      Zitat von AmicaNoctis Beitrag anzeigen
                      Nein, die Where-Klausel bleibt und filtert immer noch das Genre raus, nach dem gesucht werden soll. Sonst würde das ja an der Aufgabenstellung vorbei gehen.
                      Okay, danke, probier ich so nochmal - und sorry für meine vielleicht 'dummen' Fragen. Ich kratze programmiertechnisch noch ziemlich an der Oberfläche und versuche, so gut ich eben kann, solche Dinge selbst zu programmieren. Aber an dem Punkt komm ich gerade alleine einfach nicht weiter.

                      Gruß,
                      Markus
                      Zuletzt geändert von boxi123; 24.03.2010, 13:00. Grund: ah, danke für das Beispiel!

                      Kommentar


                      • #12
                        so wie ich es verstanden habe, sollte die Abfrage etwa so aussehen?

                        Code:
                        SELECT name, band_id, tag, naehe,alle_genres.tag, GROUP_CONCAT(tag order by tag) FROM bands_tags
                        
                        JOIN bands_master ON bands_tags.band_id = id 
                        JOIN bands_tags AS alle_genres ON alle_genres.tag = bands_tags.tag
                        
                        where tag = "alternative rock"
                        group by name 
                        ORDER BY name ASC,naehe DESC
                        Fehlermeldung: "#1052 - Column 'band_id' in field list is ambiguous".

                        Wieso ist die Band ID jetzt mehrdeutig?

                        Kommentar


                        • #13
                          Zitat von boxi123 Beitrag anzeigen
                          Wieso ist die Band ID jetzt mehrdeutig?
                          Na weil sie einmal aus bands_tags und einmal aus alle_genres kommen kann. Benutz doch einfach qualifizierende Spaltenreferenzen wie in meinem Beispiel (schreib den Tabellennamen/Alias davor).
                          [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


                          • #14
                            Zitat von AmicaNoctis Beitrag anzeigen
                            Na weil sie einmal aus bands_tags und einmal aus alle_genres kommen kann. Benutz doch einfach qualifizierende Spaltenreferenzen wie in meinem Beispiel (schreib den Tabellennamen/Alias davor).

                            jep, okay. die abfrage geht jetzt prinzipiell, ist aber noch falsch.

                            Code:
                            SELECT bands_master.name, bands_tags.band_id, bands_tags.tag, bands_tags.naehe, alle_genres.tag, GROUP_CONCAT( bands_tags.tag
                            ORDER BY bands_tags.tag ) 
                            FROM bands_tags
                            JOIN bands_master ON bands_tags.band_id = bands_master.id
                            JOIN bands_tags AS alle_genres ON alle_genres.tag = bands_tags.tag
                            WHERE bands_tags.tag = "modern metal"
                            GROUP BY name
                            ORDER BY name ASC , naehe DESC
                            Ausgabe am Beispiel "Modern Metal":
                            http://vampster.com/genres/example_g...modern%20metal

                            Diesem Genre wurden erst fünf Bands zugeordnet. In der Ausgabe erhalte ich fünf mal den Begriff "modern metal" aufgezählt. Dann ist der zweite JOIN vermutlich noch falsch?

                            Ich glaube, das ist mir alles doch eine Nummer zu hoch.

                            Kommentar


                            • #15
                              Du brauchst nur bands_tags.* im Select-Teil wegzulassen. Und im group_concat musst du natürlich alle_genres verwenden.
                              Zuletzt geändert von AmicaNoctis; 24.03.2010, 14:43.
                              [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