Abfrage mit GROUP_CONCAT und GROUP BY mag micht nicht.

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

  • 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.
    Last edited by boxi123; 23-03-2010, 22:04. Reason: Code Tags + Erläuterungen hinzugefügt

  • #2
    Originally posted by boxi123 View Post
    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 ?
    Last edited by ronronron3005; 23-03-2010, 17:20. Reason: Deutsche Sprache, schwere Sprache
    Wozu brauchen wir Kraftwerke, wenn der Strom aus der Steckdose kommt.

    Comment


    • #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]

      Comment


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

        Comment


        • #5
          Originally posted by ronronron3005 View Post
          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?

          Comment


          • #6
            Originally posted by AmicaNoctis View Post
            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

            Comment


            • #7
              Originally posted by boxi123 View Post
              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]

              Comment


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

                Gruß,
                Markus

                Comment


                • #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

                  Comment


                  • #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.
                    Last edited by AmicaNoctis; 24-03-2010, 11: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]

                    Comment


                    • #11
                      Originally posted by AmicaNoctis View Post
                      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
                      Last edited by boxi123; 24-03-2010, 12:00. Reason: ah, danke für das Beispiel!

                      Comment


                      • #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?

                        Comment


                        • #13
                          Originally posted by boxi123 View Post
                          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]

                          Comment


                          • #14
                            Originally posted by AmicaNoctis View Post
                            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.

                            Comment


                            • #15
                              Du brauchst nur bands_tags.* im Select-Teil wegzulassen. Und im group_concat musst du natürlich alle_genres verwenden.
                              Last edited by AmicaNoctis; 24-03-2010, 13: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]

                              Comment

                              Working...
                              X