Announcement

Collapse
No announcement yet.

Schnittmenge zwischen mehreren Abfragen

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

  • Schnittmenge zwischen mehreren Abfragen

    Hallo zusammen,
    leider weiß ich nicht recht wonach ich suchen muss und hoffe es kann mir jemand helfen.
    Folgendes Problem, hier ein kleiner Auszug der Tabelle:


    Nun wollte ich die UserId und die Anzahl der event_ids 301 an dem Tag als bei dem User die EventID 114 erstmalig aufgetreten ist (wobei es da nur ein ein paar gibt wo dies öfter als 1mal vorkommt).
    Mein bisheriger Ansatz war folgendermaßen aber brachte leider kein Erfolg:

    SELECT a.l_user_id, a.l_event_id, a.l_ts, COUNT(a.l_event_id) AS " Anzahl Logins am 1. Tag" FROM logfiles a,
    (
    SELECT l_user_id, l_ts FROM logfiles WHERE l_event_id = 114 GROUP BY l_user_id
    ) b
    WHERE a.l_event_id = 301 AND a.l_user_id = b.l_user_id AND a.l_ts = b.l_ts GROUP BY a.l_user_id


    Und das selbe Problem hab ich dann noch mit den ersten 3 tagen nachdem der Event 114 auftrat.

    Ich hoffe, ich hab das Problem einigermaßen verständlich geschildert und es kann mir jemand helfen. Und ich hoffe meine anderen Probleme ähnlicher Natur kann ich dann auch lösen nach dem selben Prinzip.

    Danke schonmal.

  • #2
    Hallo,
    Originally posted by MrReaper View Post
    ...Nun wollte ich die UserId und die Anzahl der event_ids 301 an dem Tag als bei dem User die EventID 114 erstmalig aufgetreten ist (wobei es da nur ein ein paar gibt wo dies öfter als 1mal vorkommt).
    Das geht nur über Subselects und am besten löst man sowas schrittweise. Zuerst mal den Tag, an dem für jeden user die EventID erstmalig auftritt. (Wobei ich erstmalig mit dem kleinsten Datum gleichsetze.
    [highlight=sql]
    select l_user_id, min(l_ts) first_event_date
    from <tabelle>
    where l_event_id = 114
    group by l_user_id
    [/highlight]
    Diese Abfrage läßt sich nun als Bedingung für die eigentliche Abfrage verwenden.
    [highlight=sql]
    select l_user_id, count(l_event_id) anz_events
    from <tabelle>
    where (l_user_id, l_ts) in (
    select l_user_id, min(l_ts) first_event_date
    from <tabelle>
    where l_event_id = 114
    group by l_user_id
    )
    and l_event_id = 301
    [/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


    • #3
      Hi, ist es möglich, dass dies bei ca 3,4 mio Einträgen eine ganze weile Arbeitet, oder stimmt da was an meinen System nicht?

      Grüße Reaper

      Comment


      • #4
        Originally posted by MrReaper View Post
        ...oder stimmt da was an meinen System nicht?
        Niemand hier weiß wie dein System konfiguriert ist und / oder ob passende Indizes existieren .
        Aber Subselects sind mit dem Ruf behaftet nicht in jedem Fall die performanteste Wahl zu sein.
        Bei einem WHERE IN und sehr vielen Datensätzen in der inneren Abfrage lohnt sich in jedem Fall ein alternativer Versuch mit WHERE EXISTS.

        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


        • #5
          mySQL -&gt; Access

          Hi ich nochmal, hat jemand eine Idee wie ich dir Abfrabe in MS Access anwenden kann.

          SELECT l_user_id, count(l_event_id) anz_events FROM logfiles
          WHERE (l_user_id, l_ts) IN (SELECT l_user_id, min(l_ts) first_event_date FROM logfiles
          WHERE l_event_id = 114 GROUP BY l_user_id) AND l_event_id = 301;


          Weil da bringt er mir den Fehler, das meine Unterabfrage mehr als ein Feld zurück gegeben wird. jemand eine Idee.
          Bin irgendwie am verzweifeln mit dem Ding, wollte es in MS Access probieren, weil das SQl System was ich genommen habe, sich immer wieder aufgehängt hatbei der Abfrage.

          Danke schonmal..

          Comment


          • #6
            Originally posted by Falk Prüfer View Post
            ...Bei einem WHERE IN und sehr vielen Datensätzen in der inneren Abfrage lohnt sich in jedem Fall ein alternativer Versuch mit WHERE EXISTS.
            [highlight=sql]
            SELECT l1.l_user_id, count(l1.l_event_id) anz_events
            FROM logfiles l1
            WHERE EXISTS (
            SELECT 1
            FROM logfiles l2
            WHERE l2.l_event_id = 114
            AND l2.l_user_id = l1.l_user_id
            HAVING min(l2.l_ts) = l1.l_ts)
            AND l1.l_event_id = 301
            GROUP BY l1.l_user_id;
            [/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

            Working...
            X