Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Doppelte Ergebnisse bei Stringconcatenation im Subquery

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Doppelte Ergebnisse bei Stringconcatenation im Subquery

    Hi,

    folgender query produziert mir doppelte Einträge bei den Musikrichtungen (letzter inner join holt die Musikrichtungen):


    Code:
    SELECT
                band.nId as id_band,
                banner.filename,
                chronic.chronic,
                band.sName as band,
                ROUND(
                    SUM( points.points)
                        / u.bandCount )
                AS points,
                GROUP_CONCAT(
                    t_music.sName SEPARATOR ', '
                ) AS music
        FROM t_band_main band
        INNER JOIN
            t_band_member bandmembers
            ON (
                bandmembers.nBand = band.nId
            )
        INNER JOIN
            t_user_main users
            ON (
                users.nId = bandmembers.nUser
            )
        INNER JOIN
            t_user_points points ON (
                -- hole Punkte vom letzten monat
                IF (
                -- januar
                -- gehe zu dezember und ein jahr zurueck
                    MONTH(NOW()) = 1,
                        MONTH(points.modified) = 12
                        AND YEAR(points.modified) = YEAR(NOW()-1)
                        AND points.id_user = bandmembers.nUser
                    ,
                -- alle anderen monate
                        MONTH(points.modified) = MONTH(NOW()) -1
                        AND YEAR(points.modified) = YEAR(NOW())
                        AND points.id_user = bandmembers.nUser
                )
            )
        INNER JOIN
            t_band_chronic chronic
            ON (
                chronic.id_band =band.nId
            )
        INNER JOIN
            t_band_images banner
            ON (
               banner.id_band = band.nId
               AND is_banner = 1
            )
        INNER JOIN
            t_music
            ON (
                t_music.nId IN (
                    SELECT
                            nMusic
                        FROM
                            t_band_music
                    WHERE
                        t_band_music.nBand = band.nId
                )
            )
    WHERE
        band.searchActive = 1
    GROUP BY band.nId
    ORDER BY points DESC
    LIMIT 10
    Bei 2 Musikrichtungen für eine band erhalte ich hier 4 Musikrichtungen, zusammengefügt über GROUP_CONCAT, z.b.:

    Brit-Rock, Brit-Rock, Classic-Rock, Classic-Rock

    Distinct bringt mich leider nicht weiter. Lasse ich die Punkteberechnung raus, klappt es auch. Leider sehe ich grade den Wald vor lauter Bäumen nicht und mich würde wirklich interessieren, wo ich hier etwas falsch mache. Tabellenstrukturen/sonstiges kann ich gerne nachreichen, falls benötigt.

    Und: Gibt es für ein derartiges Problem eine elegantere Lösung als den Subquery im Inner Join?


    viele grüße und danke


    Basti

  • rudygotya
    antwortet
    Danke fürs nochmal drauf stupsen. Hatte das probiert, aber iwie war ich der Meinung, dass das nicht klappt, warum auch immer.

    Klappt nun perfekt, danke sehr

    Code:
    SELECT
                band.nId AS id_band,
                banner.filename,
                chronic.chronic,
                band.sName AS band,
                ROUND(
                    SUM( points.points)
                        / users.bandCount )
                AS points,
                GROUP_CONCAT(
                    t_music.sName SEPARATOR ', '
                ) AS music
        FROM t_band_main band
        INNER JOIN
            t_band_member bandmembers
            ON (
                bandmembers.nBand = band.nId
            )
        INNER JOIN
            t_user_main users
            ON (
                users.nId = bandmembers.nUser
            )
        INNER JOIN
            t_user_points points
            ON (
                IF (
                        MONTH(NOW()) = 1,
                        MONTH(points.modified) = 12
                        AND YEAR(points.modified) = YEAR(NOW()-1)
                        AND points.id_user = bandmembers.nUser
                    ,
                        MONTH(points.modified) = MONTH(NOW()) -1
                        AND YEAR(points.modified) = YEAR(NOW())
                        AND points.id_user = bandmembers.nUser
                )
            )
        INNER JOIN
            t_band_chronic chronic
            ON (
                chronic.id_band =band.nId
            )
        INNER JOIN
            t_band_images banner
            ON (
               banner.id_band = band.nId
               AND is_banner = 1
            )
        INNER JOIN
            t_band_music on
                (
                t_band_music.nBand = band.nId
            )
        INNER JOIN
            t_music
            ON (
                t_music.nId = t_band_music.nMusic
            )
    WHERE
        band.searchActive = 1
    GROUP BY band.nId
    ORDER BY points DESC
    LIMIT 10
    grüße


    Basti

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Ohne Testdaten läßt sich das schwer herausfinden. Ich würde diese Stelle mal überarbeiten und den SUB-Select in einen eigenen JOIN umschreiben.

    Code:
    ..
        INNER JOIN
            t_music
            ON (
                t_music.nId IN (
                    SELECT
                            nMusic
                        FROM
                            t_band_music
                    WHERE
                        t_band_music.nBand = band.nId
                )
            )
    ..
    also in etwa so...

    Code:
    ...
        INNER JOIN t_music
            ON ( t_music.nId = ??? )
            
        INNER JOIN t_band_music
             ON t_band_music.nBand = ???
    ...
    Grüße
    Thomas

    Einen Kommentar schreiben:

Lädt...
X