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
    I like cooking my family and my pets.
    Use commas. Don't be a psycho.
    [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

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

    Kommentar


    • #3
      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
      I like cooking my family and my pets.
      Use commas. Don't be a psycho.
      [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

      Kommentar

      Lädt...
      X