pranko: mysql: auflistung anhand eines types?

guten tag,

ich hab eine datenbank mit zwei tables ... events und event_types
die beiden sind 1:1 verbunden ... also ein event hat genau einen type!

nun hab ich leider keine ahnung wie ich ein select machen kann um jeweils die letzten drei events jedes typus zu selectieren?

hat jemand eine ahnung ...
hab es mit having und limit probiert was in mysql 5.0.33 anscheinend nicht funktioniert!

eine idee?

mfg, pranko

  1. yo,

    die beiden sind 1:1 verbunden ... also ein event hat genau einen type!

    es wird sich eher um eine 1:n beziehung handeln, ein event hat einen type, ein type kann mehrere events haben.

    nun hab ich leider keine ahnung wie ich ein select machen kann um jeweils die letzten drei events jedes typus zu selectieren?

    wenn du uns die tabellennamen sagst und die spaltennamen dazu, vor allem die spalte mti dem datumswert, welche für die "letzten 3" herhalten soll.....

    Ilja

    1. es wird sich eher um eine 1:n beziehung handeln, ein event hat einen type, ein type kann mehrere events haben.

      jaja natürlich eine 1:n beziehung, sorry!

      wenn du uns die tabellennamen sagst und die spaltennamen dazu, vor allem die spalte mti dem datumswert, welche für die "letzten 3" herhalten soll.....

      die tabelle heissen events (1:n spalte lautet events.event_type) und event_type.uid und das datum ist eben events.date ...

      danke vielmals wenn du eine lösung hast!

      1. Hi,

        die Lösung besteht zu 95% Wahrschweinlichkeit aus einer korrelierenden Unterabfrage in der WHERE Klausel.

        Ilja hat die Tage bereits schon mal eine ähnliche Beispielquery gepostet in einem anderen Thread, imho hier: https://forum.selfhtml.org/?t=168239&m=1097730

        Es hängt natürlich auch davon ab, ob dein Datenbanksystem (versionsabhängig) dieses Feature unterstützt.

        Ciao, Frank

        1. Hi,

          die Lösung besteht zu 95% Wahrschweinlichkeit aus einer korrelierenden Unterabfrage in der WHERE Klausel.

          hierbei handelt es sich aber um eine m:n beziehungen! und ...
          ein limit in diesem von dir gelinkten fall funktioniert nicht! also nicht in version 5.0.33 ...

          1. Aber du hast den Sinn verstanden, bzw. den strukturellen Aufbau der Abfrage?

            m:n Beziehungen kann man immer auch zu 1:n Beziehungen vereinfachen indem man m=1 gewährleistet ... toll, nich?

            Du fängst einfach bei Event-Types an, joinsts auf Events und setzt dann die korrelierende Unterabfrage anhand von event type mittels WHERE, ORDER BY und LIMIT ein.

            ein limit in diesem von dir gelinkten fall funktioniert nicht!

            Ich würde schon sagen, dass der verlinkte Fall in seinem Kontext funktioniert, schliesslich stammt der Vorschlag ja von Ilja.

            Deine Antwort ist sowas von unkonkret, da möchte man gar nicht wirklich weiter helfen.

            Ciao, Frank

            1. Aber du hast den Sinn verstanden, bzw. den strukturellen Aufbau der Abfrage?

              ein wenig abe rnicht genug um die auf einen 1:n fall umzumünzen!
              aber erneut ...
              das beispiel von ilja funktioniert aufgrund des limits innerhalb von IN ebenfalls nicht ...

              heisst dies ich kann es nur mit einer schleife und einem select mit limit 0,5 für jeden type lösen?
              was ja funktioniert ich aber als extrem unschöne lösung sehe, oder?

              ein limit in diesem von dir gelinkten fall funktioniert nicht!

              Ich würde schon sagen, dass der verlinkte Fall in seinem Kontext funktioniert, schliesslich stammt der Vorschlag ja von Ilja.

              leider limit funkt mit IN, ANY, ... nicht zumindest gibt mir dies mysql zurück!

              Deine Antwort ist sowas von unkonkret, da möchte man gar nicht wirklich weiter helfen.

              sorry falls du dir auf den schlips getreten fühlst aber was stört dich nun hierbei? geht es um den titel der frage? weil ich echt nicht weiss wie ich es sonst ausdrücken soll, sorry ...

              nix für ungut,

              pranko

              1. Aus dem verlinkten Beispiel:

                INNER JOIN cat_nm t ON t.hier_cat_fremdschlüssel = c.id

                cat_nm ist da die m:n tabelle, wenn du stattdessen event_types einsetzt hat sich doch das Problem "aus m:n mach 1:n" für dich gelöst, oder nicht?

                aber erneut ...
                das beispiel von ilja funktioniert aufgrund des limits innerhalb von IN ebenfalls nicht ...

                Genau das war mein Aufhänger: "Funktioniert nicht" ist unkonkret, weil kann vieles bedeuten, u.a.

                • deine MySQL version möchte es nicht
                • du hast einen Syntaxfehler in der Schreibweise
                • du bekommst einfach keinen oder falshce datensätze zurück

                Die wenigsten der hier zu Hilfezwecken mitlesenden haben eine Glaskugel auf dem Tisch und können sehen was du siehst. Deshalb ist es einfach wichtig, keinerlei Details (genaue fehlermeldungen) unnötig zu abstrahieren (funktioniert nicht).

                heisst dies ich kann es nur mit einer schleife und einem select mit limit 0,5 für jeden type lösen?
                was ja funktioniert ich aber als extrem unschöne lösung sehe, oder?

                Extrem finde ich das nicht wirklich. Es ist aber wohl aufgrund deiner Beschränkungen, was MySQL angeht nicht anders lösbar. Eine nicht ganz perfekte Lösung ist immer besser als gar keine Lösung. :)

                Ich hoffe du verstehst jetzt etwas mehr. :)

                Ciao, Frank

                1. Aus dem verlinkten Beispiel:

                  ---------------------------------------------------------------------------

                  okay vollends klar deine kritik !

                  dennoch hoffe ich dass es eine lösung in nur einem statement gibt! ;-)

                  danke für die offenen worte

                  lg, pranko

                  1. yo,

                    dennoch hoffe ich dass es eine lösung in nur einem statement gibt! ;-)

                    es gibt eine, wenn mysql LIMIT nicht in unterabfragen kann, dann musst den "sauberen" weg gehen, der ein wenig mehr arbeit bedeutet, aber dann auch nach ansi sql funktioniert.

                    das prinzip bleibt eine korrelierte unterabfrage. nur das du nicht LIMIT einsetzt, sondern den datumswert auf MAX vergleichst bei dem jeweiligen gleichen type. das bringt die pro type einen datensatz, nämlich den aktuellesten.

                    da du aber die drei aktuellsten haben willst, musst du den dritt höchsten datumswert pro type ermitteln, indem du dreimal in einer unterabfrage den max-datumswert zurück gibts, der kleiner als der max-wert davor ist, also mehrere unterabfragen verschattelt.

                    ich foffe das prinzip ist deutlich, wenn nicht, frag noch mal nach.

                    Ilja

                    1. es gibt eine, wenn mysql LIMIT nicht in unterabfragen kann, dann musst den "sauberen" weg gehen, der ein wenig mehr arbeit bedeutet, aber dann auch nach ansi sql funktioniert.

                      das prinzip bleibt eine korrelierte unterabfrage. nur das du nicht LIMIT einsetzt, sondern den datumswert auf MAX vergleichst bei dem jeweiligen gleichen type. das bringt die pro type einen datensatz, nämlich den aktuellesten.

                      da du aber die drei aktuellsten haben willst, musst du den dritt höchsten datumswert pro type ermitteln, indem du dreimal in einer unterabfrage den max-datumswert zurück gibts, der kleiner als der max-wert davor ist, also mehrere unterabfragen verschattelt.

                      ich foffe das prinzip ist deutlich, wenn nicht, frag noch mal nach.

                      leider keinen schimmer ... upsi ... ;-)
                      korrelierte unterabfrage ist schon sehr schwer zu verstehen!

                      wär es zuviel verlang das beispiel zu fomrulieren? sorry für die umstände!

                      lg, pranko

                      1. Gegeben Events

                        EventId, EventTyp, Datum
                        ----------------------------------------
                        1 | 1 | 31.01.2008
                        2 | 1 | 01.02.2008
                        3 | 2 | 12.01.2008
                        4 | 2 | 02.03.2008
                        5 | 3 | 04.03.2008

                          
                        SELECT  hauptAbfrageTabelle.EventId,  
                                       hauptAbfrageTabelle.EventTyp,  
                                       hauptAbfrageTabelle.Datum  
                          FROM (SELECT DISTINCT EventTyp FROM Events) nurEventTypen  
                          INNER JOIN EventshauptAbfrageTabelle  
                             ON nurEventTypen.EventTyp = hauptAbfrageTabelle.EventTyp  
                          WHERE hauptAbfrageTabelle.Datum =  
                                   (SELECT MAX(korrelierteAbfrage.Datum)  
                                       FROM Events korrelierteAbfrage  
                                       WHERE korrelierteAbfrage.EventTyp = hauptAbfrageTabelle.EventTyp) -- das ist die Korrelation, die du zusätzlich zweimal in der selben form verschachteln musst  
                        
                        

                        Jetzt solltest du genügend Anschub bekommen haben, den Rest auch noch hinzubekommen

                        Gruss, Frank

                        1. danke sehr!

            2. #1235 - This version of MySQL doesn't yet support
              'LIMIT & IN/ALL/ANY/SOME subquery'