Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] COUNT und INNER JOINs

Einklappen

Neue Werbung 2019

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

  • [Erledigt] COUNT und INNER JOINs

    Ich sitz seit ner ewigkeit an folgendem Problem:
    Ich versuche eine Zählung von ungelesenen "NachrichtenChannels", wobei der gelesen/ungelesen Status an einzelnen Nachrichten in diesem Channel festgelegt wird.

    Allerdings scheint COUNT() nicht auf die INNER JOINs zu achten, und gibt falsche zahlen aus.

    Beispiel: Es gibt 5 Channels, davon sind 2 komplett gelesen, also 3 ungelesen.
    In einem der ungelesenen sind aber 2 ungelesene Nachrichten.
    Gewünschtes ergebnis wäre 3, da 3 ungelesene channels.
    Wirkliches Ergebnis ist zurzeit 4, da 4 ungelesene Nachrichten.

    Ich komm hier grad echt nicht weiter, villeicht kann mir jemand von euch nen Tipp geben.

    relevante Tabellen:
    ent_user, ent_message, ent_messagechannel

    und relevante relationstabellen (beinhalten neben einer eigenen ID nur die ID beider verbundener Objekte)
    cmp_recipient2message, cmp_messagechannel2message

    Mein aktueller Versuch (kurzvariante, ich verzichte auf das joinen auf ent_messagechannel und ent_user, und steig direkt bei den relationen ein):
    Code:
    SELECT
        COUNT(`cmp_messagechannel2message`.`MessageChannelID`)
    FROM
        `cmp_recipient2message`
    INNER JOIN
        `ent_message`
        ON `ent_message`.`MessageID` = `cmp_recipient2message`.`MessageID`
    INNER JOIN
        `cmp_messagechannel2message`
        ON `cmp_messagechannel2message`.`MessageID` = `ent_message`.`MessageID`
    WHERE
        `cmp_recipient2message`.`UserID` = 1 AND `ent_message`.`IsRead` = FALSE
    Ich hab inzwischen alles mögliche versucht, sogar mit subselects, aber ich komm einfach nicht auf das gewünschte Ergebnis.

    Vorschläge?

  • #2
    Zitat von Screeze Beitrag anzeigen
    Code:
    SELECT
        COUNT(`cmp_messagechannel2message`.`MessageChannelID`)
    FROM
        `cmp_recipient2message`
    INNER JOIN
        `ent_message`
        ON `ent_message`.`MessageID` = `cmp_recipient2message`.`MessageID`
    INNER JOIN
        `cmp_messagechannel2message`
        ON `cmp_messagechannel2message`.`MessageID` = `ent_message`.`MessageID`
    WHERE
        `cmp_recipient2message`.`UserID` = 1 AND `ent_message`.`IsRead` = FALSE
    Ohne genaue Kenntnisse des Datenmodell plus ein paar Testdaten läßt sich da nicht viel sagen, ich vermute das Problem liegt hier..

    Code:
    ..
    AND `ent_message`.`IsRead` = FALSE
    ..
    Was für ein Datentyp ist IsRead ? Eventuell muss die Abfrage auf NULL lauten, also..

    Code:
    ..
    AND `ent_message`.`IsRead` IS NULL
    ..
    Grüße
    Thomas

    Kommentar


    • #3
      Das ist ein Boolean wert.
      Das funktioniert schon, sonst wär das ergebnis 6 (4 nachrichten in den 3 ungelesenen channeln + 2 in den gelesenen)

      Aber COUNT zählt statt der channels die nachrichten irgendwie...

      Kommentar


      • #4
        Zitat von Screeze Beitrag anzeigen
        Code:
        SELECT
            COUNT(DISTINCT `cmp_messagechannel2message`.`MessageChannelID`)
        FROM
            `cmp_recipient2message`
        INNER JOIN
            `ent_message`
            ON `ent_message`.`MessageID` = `cmp_recipient2message`.`MessageID`
        INNER JOIN
            `cmp_messagechannel2message`
            ON `cmp_messagechannel2message`.`MessageID` = `ent_message`.`MessageID`
        WHERE
            `cmp_recipient2message`.`UserID` = 1 AND `ent_message`.`IsRead` = FALSE
        Was für ein Datentyp ist `cmp_messagechannel2message`.`MessageChannelID` ?

        Ist NULL erlaubt?

        Eventuell hilft COUNT(DISTINCT ...) (siehe oben)..

        Wie gesagt, ich rate hier mal so rum.

        EDIT
        Pauschal läßt sich sagen, wenn die Ergebnisse von COUNT() zu hoch sind, sind die JOINs zwischen den Tabellen nicht korrekt. Es sind keine 1:1 Verknüpfungen, sondern etwas anderes.

        Grüße
        Thomas

        Kommentar


        • #5
          Danke, DISTINCT war das schlüsselwort das mir gefehlt hat, wieder was gelernt

          Kommentar

          Lädt...
          X