Ankündigung

Einklappen
Keine Ankündigung bisher.

abfrage ausgabe der ID welche am nächsten ist

Einklappen

Neue Werbung 2019

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

  • abfrage ausgabe der ID welche am nächsten ist

    Hallo,

    Gibt es direkt in Mysql die Möglichkeitet eine solche abfrage zu erstellen?

    $zeiteingabe= 08:01:00 05.01.2014

    Select ID where Zeit (ist oder wenn nicht existiert die am nächstenligende) = $Zeiteingabe

    wäre supper wenn dies mysql von Haus aus kann.

    Danke Euch

  • #2
    Zitat von tiego Beitrag anzeigen
    Gibt es direkt in Mysql die Möglichkeitet eine solche abfrage zu erstellen? […]
    Je nach dem ob die zu findende Zeit vor oder nach der angegebenen Zeit liegen soll oder ob es egal ist: Entweder die Differenz aus gegebener Zeit und denen in der Datenbank berechnen und die mit dem kleinsten Wert nehmen oder die erste Zeit nehmen die kleiner bzw. größer ist als die angegebene Zeit.

    Kommentar


    • #3
      Zitat von tiego Beitrag anzeigen
      Hallo,

      Gibt es direkt in Mysql die Möglichkeitet eine solche abfrage zu erstellen?

      $zeiteingabe= 08:01:00 05.01.2014

      Select ID where Zeit (ist oder wenn nicht existiert die am nächstenligende) = $Zeiteingabe

      wäre supper wenn dies mysql von Haus aus kann.

      Danke Euch
      tk1234 sagte ja schon, wie das gehen kann. Berecne halt die Differenz zu allen anderen Zeiten und sortiere absteigend nach der Differenz mit Limit 1, dann hast das, was Du suchst.

      In PostgreSQL ginge das eleganter und indexbasiert via KNN-Index (K Nearest Neighbor Search):

      Code:
      test=# create table tiego2 (id int, ts timestamp);
      CREATE TABLE
      Time: 1,034 ms
      test=*# insert into tiego2 select s, now() + random()*100 * '1minute'::interval from generate_series(1,20) s;
      INSERT 0 20
      Time: 0,723 ms
      test=*# create index idx_knn on tiego2 using gist(ts);
      CREATE INDEX
      Time: 31,954 ms
      test=*# set enable_seqscan to off;
      SET
      Time: 0,064 ms
      test=*# explain analyse select * from tiego2 order by ts <-> '2015-01-06 08:04:00'::timestamp limit 3;
                                                             QUERY PLAN
      ------------------------------------------------------------------------------------------------------------------------
       Limit  (cost=0.13..1.39 rows=3 width=12) (actual time=0.031..0.036 rows=3 loops=1)
         ->  Index Scan using idx_knn on tiego2  (cost=0.13..8.53 rows=20 width=12) (actual time=0.030..0.033 rows=3 loops=1)
               Order By: (ts <-> '2015-01-06 08:04:00'::timestamp without time zone)
       Planning time: 0.075 ms
       Execution time: 0.065 ms
       
      (5 rows)
      
      Time: 0,583 ms
      test=*# select * from tiego2 order by ts <-> '2015-01-06 08:04:00'::timestamp limit 3;
       id |             ts
      ----+----------------------------
        9 | 2015-01-06 08:12:00.462853
        7 | 2015-01-06 07:53:44.320111
       13 | 2015-01-06 08:14:25.170675
      (3 rows)
      Aber solch komplexe Indexe und Operatoren wie <-> kann MySQL selbstverständlich nicht.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Danke, leider habe Ich nur Mysql bei meinem Hoster.

        @tk1234 wie kann ich dies am einfachsten lösen? ob die vorherige oder spätere Zeit verwendet wird ist egal

        danke

        Kommentar


        • #5
          Zitat von tiego Beitrag anzeigen
          Danke, leider habe Ich nur Mysql bei meinem Hoster.
          Wechseln.

          @tk1234 wie kann ich dies am einfachsten lösen? ob die vorherige oder spätere Zeit verwendet wird ist egal

          danke
          Siehe auch meine Antwort. Ich hab es da auch erklärt.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            habe die lösung...

            SELECT * FROM `tiego` WHERE `Zeit` >= "2015-01-05 11:41:00" ORDER BY `Zeit` asc limit 1

            danke euch

            Kommentar


            • #7
              Zitat von tiego Beitrag anzeigen
              habe die lösung...

              SELECT * FROM `tiego` WHERE `Zeit` >= "2015-01-05 11:41:00" ORDER BY `Zeit` asc limit 1

              danke euch
              Klang bisher so, als ob vorher/nachher Zeiten sind und Du die haben willst, die am nächsten dran ist - das kann vorher ODER nachher sein. Wenn dem so ist dann liefert Dir diese Abfrage nur mit 50% Sicherheit das korrekte Ergebnis.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                danke für den hinweis. Habe Ich gar nicht berücksichtigt.

                kann man die nächste anders rausfinden?

                Kommentar


                • #9
                  Zitat von tiego Beitrag anzeigen
                  danke für den hinweis. Habe Ich gar nicht berücksichtigt.

                  kann man die nächste anders rausfinden?
                  Mach 2 Abfrage, einmal was kleiner ist und einmal was größer ist. Berechne dazu die Differenz zum 'Ziel' und nehme das, was kleiner ist. Die 2 Abfragen kannst Du z.B. mit UNION zusammenkleben und nach der Differenz sortiert mit Limit 1 ausgeben. Eigentlich ganz einfach, man muß nur mal für 3 Cent nachdenken.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Hallo,

                    nach langem Testen:

                    PHP-Code:
                    select `Zeit`, `ID`, TIMESTAMPDIFF(second,"2015-01-05 11:41:00",`Zeit`) AS differenz FROM tiego WHERE `Zeit` >= "2015-01-05 11:41:00" union select `Zeit`, `ID`, TIMESTAMPDIFF(second,`Zeit`,"2015-01-05 11:41:00") AS differenz FROM tiego WHERE `Zeit` <= "2015-01-05 11:41:00" ORDER BY `differenzASC limit 60 

                    leider dauert die abfrage 5-9 sekunde.
                    ist dies normal?

                    Kommentar


                    • #11
                      PHP-Code:
                      (select `Zeit`, `ID`, TIMESTAMPDIFF(second,"2015-01-05 11:41:00",`Zeit`) AS differenz FROM tiego WHERE `Zeit` >= "2015-01-05 11:41:00" order by differenz asc limit 10union (select `Zeit`, `ID`, TIMESTAMPDIFF(second,"2015-01-05 11:41:00",`Zeit`) AS differenz FROM tiego WHERE "2015-01-05 11:41:00" >= `Zeitorder by differenz desc limit 10)order by differenz asc 
                      0,5 sec laut euch verwendbar?

                      Kommentar

                      Lädt...
                      X