Announcement

Collapse
No announcement yet.

Anzahl Einträge mit gleicher ID in anderer Tabelle

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

  • Anzahl Einträge mit gleicher ID in anderer Tabelle

    Hallo Leute,

    ich habe jetzt einige Zeit damit verbracht dieses Problem zu lösen, aber weiss mir inzwischen keinen Rat. Ich hab es mir LEFT OUTER JOIN, einfachen WHERE Klauseln und GROUP BY probiert, aber komme nicht wirklich auf einen grünen Zweig.

    Zum Aufbau:

    Tabelle A: Speichert Veranstalter, besitzt ein Feld ID
    Tabelle B: Speichert Veranstaltungen, besitzt ein Feld "Veranstalter" mit der ID des Veranstalters.

    Ziel:
    Die Abfrage soll alle Informationen der Veranstaltertabelle PLUS ein Feld "Veranstaltungsanzahl" enthalten, in dem die Anzahl aller Einträge in der Tabelle Veranstaltungen geschrieben steht, die im Feld "Veranstalter" die ID des jeweilgen Veranstalters enthalten.

    Bisher hatte ich das durch 2 SQL-Abfragen gelöst. Die erste liesst einfach alle Veranstalterdaten aus, die zweite erzeugt ein Array in dem jeder VeranstalterID die Anzahl der Veranstaltungen zugeordnet sind. Das geht aber leider nicht mehr, da die Tabelle am Ende nach Anzahl der Veranstaltungen sortiert werden soll. Dazu brauche ich ein Feld für den ORDER BY Befehl.

    Ich hoffe es kommt in etwa rüber was ich versuche zu erreichen. Schonmal vielen Dank und Grüße,
    Philipp

  • #2
    Man könnte es mit einem Subselect versuchen
    [highlight="sql"]
    select
    <Feldliste Tabelle B>,
    ( select count( b.id) from tabelleb b where b.id = a.veranstalter) as Anzahl
    from
    tabelleb a;
    [/highlight]

    Comment


    • #3
      Select A.Feld1, A.feld2,...,count(*) as anzahl
      from A, B
      where B.Veranstalter=A.ID
      Group By a.feld1,a.feld2 ...

      Gruß
      docendo discimus

      Comment


      • #4
        Danke für die Antwort. Die letzte Abfrage funktioniert schon ganz gut, aber ich bekomme leider nur Veranstalter ausgegeben die auch wirklich eine Veranstaltung angemeldet haben. Angezeigt werden sollen aber alle, auch die, die noch keine Veranstaltung eingetragen haben. Dort soll dann in "Anzahl" eine 0 stehen.

        Aber durch die WHERE Klausel schließe ich das ja quasi aus, oder?

        Comment


        • #5
          Select A.Feld1, A.feld2,...,count(*) as anzahl
          from A, B
          where B.Veranstalter=A.ID
          Group By a.feld1,a.feld2 ...
          union all select
          Select A.Feld1, A.feld2,..., 0 as anzahl
          from A
          where not exists
          (select * from b where
          B.Veranstalter=A.ID)
          docendo discimus

          Comment


          • #6
            Da das Editieren grad nicht geht:
            Im Union Statement ist ein select zuviel
            docendo discimus

            Comment


            • #7
              Hi,

              hier mal die SQL-Abfrage so wie ich sie für mein Beispiel geschrieben habe:

              PHP Code:
              SELECT a.organisationa.idb.veranstaltercount(*) as anzahl
              FROM jos_organisateurs 
              as ajos_spectacles as b
              WHERE b
              .veranstalter a.id
              GROUP BY a
              .organisationa.id
              UNION ALL 
              SELECT a
              .organisationa.idb.veranstalteras anzahl
              FROM jos_organisateurs 
              as ajos_spectacles as b
              WHERE NOT EXISTS
              (SELECT FROM jos_organisateurs as ajos_spectacles as b
              WHERE b
              .veranstalter a.id
              Leider bekomme ich nach wie vor nur diejenigen Veranstalter aufgelistet, die auch Veranstaltungen eingetragen haben

              Da ich die aktuelle Abfrage nicht 100%ig verstehe fällt es mir auch noch schwer jetzt davon abgeleitet die richtige Abfrage zu erstellen. Hat jemand sonst eine Idee?

              Comment


              • #8
                Hallo,

                Du darfst in der Union-Abfrage keine Werte aus der Tabelle Veranstaltungen
                selektieren, da diese ja nicht existieren sollen, wie das where not exists ja aussagt. Das b.veranstalter brauchst Du sowieso nicht, da es ja dem a.id
                entspricht.
                Versuch es jetzt mal so:

                SELECT a.organisation, a.id, count(*) as anzahl
                FROM jos_organisateurs as a, jos_spectacles as b
                WHERE b.veranstalter = a.id
                GROUP BY a.organisation, a.id
                UNION ALL
                SELECT a.organisation, a.id, 0 as anzahl
                FROM jos_organisateurs as a
                WHERE NOT EXISTS
                (SELECT * FROM jos_spectacles as b
                WHERE b.veranstalter = a.id)
                docendo discimus

                Comment


                • #9
                  Wow. Ich verstehe es immernoch nicht ganz, aber es funktioniert. Ich muss dieses NOT EXISTS mal nachschlagen. DAs heisst also, er schließt diese Daten von der Abfrage aus?

                  Comment


                  • #10
                    Hallo,

                    not exists heißt einfach:
                    es gibt keinen Datensatz, der mit dem Select in der Klammer gefunden werden kann.
                    In Deinem Fall :
                    Es gibt keine Veranstaltung zum Veranstalter.

                    Gruß
                    docendo discimus

                    Comment


                    • #11
                      Hallo,

                      warum löst ihr das so kompliziert über ein UNION und NOT EXISTS? Dafür reicht doch ein einfacher OUTER JOIN oder hab ich was übersehen?
                      [highlight=sql]
                      SELECT a.organisation, a.id, b.veranstalter, count(b.veranstalter) as anzahl
                      FROM jos_organisateurs as a
                      left join jos_spectacles as b on b.veranstalter = a.id
                      GROUP BY a.organisation, a.id, b.veranstalter
                      [/highlight]

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hallo Falk,

                        hier meine Beweggründe :

                        1. Zunächst war mir nicht bekannt, dass es auch Veranstalter ohne Veranstaltungen gibt.

                        2. Als es bekannt war, war das DBMS nicht bekannt. Deshalb habe ich es allgemeingültig gelöst.

                        Und noch eine Frage an Dich: Warum liest Du das Feld b.veranstalter,
                        wo es doch identisch mit a.id ist

                        Gruß

                        frauwue
                        docendo discimus

                        Comment


                        • #13
                          Hallo frauwue,
                          Originally posted by frauwue View Post
                          ...2. Als es bekannt war, war das DBMS nicht bekannt. Deshalb habe ich es allgemeingültig gelöst.
                          Ich würde ja denken das ein LEFT JOIN mindestens genauso (wenn nicht mehr) allgemeingültig ist wie ein UNION - beides ist SQL-Standard.

                          Originally posted by frauwue View Post
                          ...
                          Und noch eine Frage an Dich: Warum liest Du das Feld b.veranstalter,
                          wo es doch identisch mit a.id ist
                          Ich habe einfach die Select-Liste aus dem Beispiel von phphil kopiert . Aber da es sich um einen OUTER JOIN handelt, sind a.id und b.veranstalter NICHT identisch. b.veranstalter KANN NULL sein! Deshalb darf auch nicht COUNT(*) verwendet werden, da dies bekanntlich ALLE Datensätze zählt. Da nur die Veranstaltungen gezähtlt werden sollen, ist hier das COUNT(b.veranstalter) zwingend!

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Hallo Falk,

                            es gibt durchaus auch Leute, die z. Zt. noch mit anderen (älteren) DBMS arbeiten
                            (z. B. frauwue).
                            LEFT JOIN geht da nicht aber UNION. COUNT auf ein einzelnes Feld
                            geht bei mir auch nicht.

                            Wie ist es denn mit dem JOIN in ORACLE, ich dachte das geht nur mit
                            "+" Zeichen?.

                            Um allen weiteren Missverständnissen vorzubeugen jetzt nochmal Dein Statement in der von mir korrigierten aber nicht allgemeingültigen Version:

                            Code:
                            SELECT a.organisation, a.id,  count(b.veranstalter) AS anzahl 
                            FROM jos_organisateurs AS a
                            LEFT JOIN jos_spectacles AS b ON b.veranstalter = a.id
                            GROUP BY a.organisation, a.id
                            docendo discimus

                            Comment


                            • #15
                              Originally posted by frauwue View Post
                              ...es gibt durchaus auch Leute, die z. Zt. noch mit anderen (älteren) DBMS arbeiten
                              (z. B. frauwue).
                              LEFT JOIN geht da nicht aber UNION. COUNT auf ein einzelnes Feld
                              geht bei mir auch nicht.

                              Wie ist es denn mit dem JOIN in ORACLE, ich dachte das geht nur mit
                              "+" Zeichen?.
                              Ich will ja nicht schon wieder eine Offtopic-Diskussion vom Zaun brechen, aber wir befinden uns hier im SQL-Forum und nicht in einem "Älteren-DBMS"- und auch nicht im Oracle-Forum. Und LEFT JOIN gehört seit mindestens 1992 zum SQL-Standard.
                              Nichtdestotrotz ist deine Korrektur akzeptiert

                              Gruß Falk
                              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                              Comment

                              Working...
                              X