kostenloser Webspace werbefrei: lima-city


MySQL - query: Periode / Wiederholung

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi,
    ich würde gerne eine tag/art">Art 'Periode' in meiner Abfrage haben.

    Beispiel
    :

    Datenbank enthält 100 Einträge mit einer durchlaufenden ID:

    value | ...
    ...... 1 | ...
    ...... 2 | ...
    ...... 3 | ...
    ..... ... | ...
    .. 100 | ...

    Ich möchte jetzt zumbeispiel alle Ergebnisse aus der 2er Reihe, die in der Datenbank vorhanden sind selectieren:

    Einträge, die Selectiert werden sollen: 2, 4, 6, 8, 10 ...

    Als Ausgangswert habe ich dabei aber nur die 2. Ich brauche also eine Abfrage in der Art
    'SELECT * FROM table WHERE value = PERIODE(2, 2)'

    Der ausgedachte PERIODE(x, y) Block macht nicht anderes als folgende Ergebnisse zu liefern:
    1) x
    2) x+y
    3) x+2y
    4) x+3y
    n) x+(n-1)y

    Achtung:
    Ich möchte das ganze nicht über PHP machen, ich weiss das das möglich wäre und wohl auch ein bisschen einfacher, aber ich möchte hier wirklich auf einen reinen MYSQL Query setzen (sofern möglich).

    Ausserdem brauche ich wirklich die Funktionalität der ausgedachten PERIODE(x,y) Funktion. In diesem Beispiel würde es zwar auch ausreichen, immer den 2. Eintrag zu nehmen das ist aber nicht das was ich brauche!

    Wäre cool wenn sich das mit MYSQL Mitteln umsetzen ließe.
    Liebe Grüße und vielen Dank für eure Antworten im Vorraus :)





    Beitrag zuletzt geändert: 27.4.2013 13:06:36 von programtools
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mit einem Modulus ist das einfach zu lösen:

    SELECT * FROM table WHERE value % y = x

    Das heisst wenn z.B. y=5 und x=3 ist bekommst du die IDs:
    3, 8, 13, 18,...

    Du musst aber beachten, dass dieser Query immer die (x+ny)te ID heraus sucht und nicht die (x+ny)te Reihe. Sprich, wenn du z.B. Reihe 9 löscht wird der Query trotzdem 3, 8, 13, 18,... zurück geben, und nicht 3, 8, 14, 19,... Wenn du die (x+ny)te Reihe haben möchtest musst du das über einen subquery lösen.

    Beitrag zuletzt geändert: 28.4.2013 6:48:21 von wrertzu
  4. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    wrertzu schrieb:
    Mit einem Modulus ist das einfach zu lösen:

    SELECT * FROM table WHERE value % y = x

    Das heisst wenn z.B. y=5 und x=3 ist bekommst du die IDs:
    3, 8, 13, 18,...

    Du musst aber beachten, dass dieser Query immer die (x+ny)te ID heraus sucht und nicht die (x+ny)te Reihe. Sprich, wenn du z.B. Reihe 9 löscht wird der Query trotzdem 3, 8, 13, 18,... zurück geben, und nicht 3, 8, 14, 19,... Wenn du die (x+ny)te Reihe haben möchtest musst du das über einen subquery lösen.



    Danke, diese Technik sieht schonmal vielversprechend aus.

    Allerdings ist mein Fall etwas komplexer und ich bin mir nicht sicher ob ich den Modulo richtig anwende bzw ob es überhaupt geht.

    Ich habe in einer Tabelle eine Liste von starttimestamps und endtimestamps

    ich frage nun alle Einträge ab, die an einem Tag starten (von diesem Tag habe ich den Timestamp mit 0h, 0m und 0s -> $timestamp), enden oder über einen tag gehen:
    $query = "SELECT termins.title, termins.shortdesc, termins.longdesc, termins.type, termins.id FROM termins_dates, termins WHERE termins_dates.starttimestamp < '".($timestamp+24*60*60)."' AND termins_dates.endtimestamp  > '".$timestamp."' AND termins_dates.termin_id = termins.id";


    Ich möchte jetzt soetwas wie einen 'wöchentlichen' oder 'Monatlichen' Termin haben.
    Kann ich das mit MySQL Mitteln dann umsetzen? (vorallem wegen der unterschiedlich langen Monate)

    MFG
  5. programtools schrieb:
    Ich möchte jetzt soetwas wie einen 'wöchentlichen' oder 'Monatlichen' Termin haben.
    Kann ich das mit MySQL Mitteln dann umsetzen? (vorallem wegen der unterschiedlich langen Monate)


    Das meiste nehmen dir die MySQL Date/Time Funktionen doch ab. Für Monatliche Termine könnte das z.B. so aussehen:

    SELECT [columns] FROM [tables] WHERE DATE(starttimestamp) >= DATE($timestamp) AND DATE(starttimestamp) = DATE(endtimestamp) AND DAY(starttimestamp) = DAY($timestamp)


    Wir fragen also nach allen Einträgen bei welchen:
    -> Das Startdatum $timestamp ist oder in der Zukunft liegt: DATE(starttimestamp) >= DATE($timestamp)
    -> Der Termin am gleichen Tag anfängt und aufhört: DATE(starttimestamp) = DATE(endtimestamp)
    -> Der Monatstag gleich ist wie in $timestamp: DAY(starttimestamp) = DAY($timestamp)

    Für wöchentliche Termine musst du nur die letzte Abfrage andern. Dich interessiert ja nicht der Monatstag, sondern ob der Wochentag gleich ist. Es sollte also etwas in diese Richtung sein:

    SELECT [columns] FROM [tables] WHERE DATE(starttimestamp) >= DATE($timestamp) AND DATE(starttimestamp) = DATE(endtimestamp) AND DAYOFWEEK(starttimestamp) = DAYOFWEEK($timestamp)


    Ich weiss natürlich nicht was genau du brauchst, aber ich hoffe das hilft erstmal. Ansonsten schau dir doch einfach mal die MySQL Date/Time Referenz an.

    Beitrag zuletzt geändert: 28.4.2013 21:10:11 von wrertzu
  6. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    haha, das ist genial!
    Ich war total auf die timestamps fixiert :/

    Geht so natürlich viel viel einfacher und übersichtlicher!
    Vielen dank für deine ausführliche Beschreibung und Hinweise!
    Hat mir sehr weiter geholfen!

    Liebe Grüße
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!