Ankündigung

Einklappen
Keine Ankündigung bisher.

[GELÖST] SQL Abfrage - Termine aus Nextcloud-Kalender

Einklappen

Neue Werbung 2019

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

  • [GELÖST] SQL Abfrage - Termine aus Nextcloud-Kalender

    Hallo

    Ich versuche aus meiner Nextcloud-Datenbank Termine auszulesen. Leider sind die Werte ein bisschen verteilt:
    In der Tabelle oc_calendarobjects gibt es für jeden Termin ein Datensatz mit Zeitangaben.
    In der Tabelle oc_calendarobjects_props sind dann die Werte für Summary, Location und Description auf 3 Datensätze verteilt, welche jeweils mit dem Termin in oc_calendarobjects referenzieren.
    Mein Ziel ist es, alle Termine als einen Datensatz zu selektieren, jeweils mit den Spalten firstoccurence, lastoccurence, SUMMARY, LOCATION, DESCRIPTION.

    Habe hier ein Beispiel erstellt:
    http://sqlfiddle.com/#!9/cf082b/1

    Kann mir bitte jemand helfen, das Statement zu bauen?

    lg

  • #2
    Wo sind denn da Termine? Ein Termin wird in einer Datenbank als DATETIME gespeichert. Format ist 'YYYY-MM-DD hh:mm:ss' und nicht bigint. Und warum tragen deine Tabellen das Präfix oc_ ?

    Kommentar


    • #3
      Ja das Schema habe nicht ich gemacht sondern die Macher von Nextcloud
      Der Zeitraum wird in den Spalten firstoccurence und lastoccurence definiert und liegt als unix_timestamp vor.

      Kommentar


      • #4
        Warum nutzt du denn einen Fremdanbieter?
        Jeder Hoster hat php und mind. eine DB anzubieten. Und lokal gibt es alles als Paket kostenlos, Wamp, Xampp, Easyphp etc,
        Du kannst zum Testen sogar auf einen Freehostanbieter ausweichen wenn du keine eigene Domain haben willst.

        Aber mit einem falschen DB-Design wird das nur etwas halbherziges und später musst du das dann alles wieder ändern, also doppelte Arbeit. Ich würde davon absehen und biete daher auch keine Lösung an.

        Kommentar


        • #5
          Tut mir leid, aber du versteht wohl den Sinn von Nextcloud nicht ganz.
          Nun, es geht ja auch garn nicht darum wieso Nextcloud oder wie sinnvoll das DB-Design ist. Daran kann ich nichts ändern.
          Die Nextcloud läuft lokal auf meinem Server und ich muss an diese Termine rankommen.

          Kommentar


          • #6
            Tut mir leid, aber du versteht wohl den Sinn von Nextcloud nicht ganz.
            Muss ich auch nicht, hier geht es ums programmieren, nicht um Sonderwünsche für eine Firma die Netzdienste anbietet.
            Aber evtl. hilft dir ja jemand anderes ein kaputtes DB-Design so hinzubiegen, dass dein gewünschtes Ergebnis herauskommt.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              hier geht es ums programmieren
              Das dachte ich auch.
              Die Gründe wozu ich die Nextcloud-Termine in meine Website integrieren möchte sollten sekundär sein.



              Kommentar


              • #8
                Teste mal folgendes, nicht optimiert nur dahingeschmissen - bin auch nicht gerade ein Profi in Sachen Datenbanken...hat mich halt nur mal interessiert.

                gelöscht Aufgabe geändert.....

                Kommentar


                • #9
                  Das sieht nach einem brauchbaren Resultat aus Ich danke dir für deine Mühe.
                  In welcher Hinsicht denkst du, dass diese Query nicht optimal ist? Wegen Performance oder rein ästhetisch?

                  Update:
                  Habe noch eine Einschränkung gefunden: Es gibt Termine, welche keinen Datensatz für LOCATION oder DESCRIPTION haben, weil diese Felder in Nextcloud nicht ausgefüllt wurden. Diese Termine werden bei diesem Query nicht angezeigt. Habe das Beispiel entsprechend erweitert:
                  http://sqlfiddle.com/#!9/891333/2

                  Kommentar


                  • #10
                    versuche folgendes:

                    Code:
                    select a.id,
                           (SELECT max(value) from oc_calendarobjects_props where name='SUMMARY' AND objectid=a.id) as SUMMARY,
                           (SELECT max(value) from oc_calendarobjects_props where name='DESCRIPTION' AND objectid=a.id) as DESCRIPTION
                    from
                    oc_calendarobjects a
                    Als Beispiel, den Rest bekommst Du hin....

                    Kommentar


                    • #11
                      Bingo!
                      Das ist die Lösung:

                      Code:
                      select * from
                        (SELECT
                          a.id,
                          a.firstoccurence,
                          a.lastoccurence,
                          (SELECT max(value) from oc_calendarobjects_props where name='SUMMARY' AND objectid=a.id) as SUMMARY,
                          (SELECT max(value) from oc_calendarobjects_props where name='DESCRIPTION' AND objectid=a.id) as DESCRIPTION,
                          (SELECT max(value) from oc_calendarobjects_props where name='LOCATION' AND objectid=a.id) as LOCATION
                      from oc_calendarobjects a
                      inner join oc_calendarobjects_props b
                      on b.objectid = a.id) c
                      group by id
                      http://sqlfiddle.com/#!9/891333/41


                      Alle Termin, egal ob ein Feld ausgefüllt wurde oder nicht, werden nun gefunden.
                      Danke vielmal!

                      Kommentar


                      • #12
                        reicht dir nicht
                        Code:
                        SELECT
                          a.id,
                          a.firstoccurence,
                          a.lastoccurence,
                          (SELECT max(value) from oc_calendarobjects_props where name='SUMMARY' AND objectid=a.id) as SUMMARY,
                          (SELECT max(value) from oc_calendarobjects_props where name='DESCRIPTION' AND objectid=a.id) as DESCRIPTION,
                          (SELECT max(value) from oc_calendarobjects_props where name='LOCATION' AND objectid=a.id) as LOCATION
                        from oc_calendarobjects a
                        http://sqlfiddle.com/#!9/891333/43

                        Kommentar


                        • #13
                          Du hast recht. Kürzer ist immer besser

                          Kommentar


                          • #14
                            Das wäre mein Vorschlag:
                            PHP-Code:
                            SELECT
                              a
                            .id,
                              
                            a.calendarid,
                              
                            a.firstoccurence,
                              
                            a.lastoccurence,
                              
                            b.value as Summary,
                              
                            c.value as Location,
                              
                            d.value as Description
                            from oc_calendarobjects a
                            left join oc_calendarobjects_props b
                              on b
                            .objectid a.id and  b.name 'SUMMARY'
                            left join oc_calendarobjects_props c
                              on c
                            .objectid a.id and c.name 'LOCATION'
                            left join oc_calendarobjects_props d
                              on d
                            .objectid a.id and d.name 'DESCRIPTION' 
                            http://sqlfiddle.com/#!9/891333/48

                            Bei solchen Reverse Engineering Sachen musst Du natürlich immer auf Fehler gefasst sein, besonders bei neuen Releases oder einfach weil es eben reverse gemacht ist.
                            Ich habe im meiner Variante alle Values optional gemacht und auch nicht weiter drüber nachgedacht, ob alles berücksichtigt ist.

                            Das Statement ist jedenfalls "geschmeidiger", weil es keine falschen Daten produziert, die erst außen wieder gefiltert werden und dürfte damit schneller und schonender sein.

                            protestix
                            Ich finde, es ist ziemlich legitim open source software zu nutzen und zu adaptieren. Der TE muss natürlich die Lizenzbestimmungen berücksichtigen.
                            Im Zweifel würde er seine Integration oder Erweiterung auch veröffentlichen müssen, was ja genau der Gedanke dahinter ist.

                            Im Einzelfall ist es auch gar keine Frage, primär OS zu nutzen und nur Erweiterungen selbst zu entwickeln. Es stärkt die Nutzung von OS und ermöglicht viele Dinge überhaupt erst.

                            Und zuletzt:
                            Bevor man solche SQL Klimmzüge bei solcher Software macht, lohnt sich natürlich auch immer ein Blick auf die verfügbaren API. Gibt es sie, dann ist das auf jden Fall vorzuziehen. Hab da bei Nextcloud grad keinen Überblick.

                            Kommentar


                            • #15
                              Zitat von grafen Beitrag anzeigen
                              Du hast recht. Kürzer ist immer besser
                              Ja, aber man kann auch das Ergebnis direkt so kürzen, dass man es nicht nachträglich aggregieren muss.

                              Kommentar

                              Lädt...
                              X