Ankündigung

Einklappen
Keine Ankündigung bisher.

Anzahl aus Bereich von Einträgen lesen

Einklappen

Neue Werbung 2019

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

  • Anzahl aus Bereich von Einträgen lesen

    Hallo Leute,

    ich habe das Internet bereits durchwühlt und hätte zwar selbst eine Lösung mit PHP für dieses Problem, jedoch wäre es mir lieber wenn ich die Daten direkt so aus der Datenbank lesen könnte. Folgende Aufgabe:

    Ich möchte eine bestimmte Anzahl an Datenzeilen zwischen einem Indexbereich auslesen. Diese ausgelesenen Daten sollen in der Mitte des Datenbereichs liegen, sprich: (es geht um Objektdurchmesser)

    >> Anfrage an Datenbank: Durchmesser 19
    >> 5 Objekte sollen angezeigt werden

    .....
    8
    9
    12
    14
    15
    16 >> auch Auslesen
    17 >> auch Auslesen
    19 >>>> Kernauswahl
    30 >> auch Auslesen
    50 >> auch Auslesen
    55
    ......

    Das Problem bei der Lösung über PHP ist, dass ich immer mehr Zeilen aus der Datenbank lesen muss als nötig um dann die mittleren Elemente herauszulesen.
    Da die Durchmesser bei größeren Größen weiter auseinander liegen, kann ich auch nicht einfach den pauschalen BETWEEN Wert verwenden ( Angefragter Wert einfach -+ 5 )

    Wäre super wenn jemand wüsste wie ich das lösen könnte.

    Liebe Grüße

  • #2
    Wenn ich dich richtig verstanden habe dann willst du also Werte raus suchen die 5 Anteile darunter oder auch darüber einem bestimmten Wert liegen.

    Das wäre dann so etwas
    PHP-Code:
    SELECT iddurchmesser, [weitere FelderFROM myTable WHERE durchmesser BETWEEN (19-5) AND (19+5
    Was ich jetzt nicht verstehe ist deine Aussage, dass du BETWEEN nicht verwenden kannst wenn die Durchmesser grösser werden?
    Du kannst doch in diesem Fall auch von prozentualer Abweichung ausgehen. Also -5% und +5% das wäre dann
    PHP-Code:
    SELECT iddurchmesser, [weitere FelderFROM myTable WHERE durchmesser BETWEEN (19*0.95) AND (19*1.05
    Kommt das deinen Vorstellungen näher?

    Kommentar


    • #3
      Zitat von TheRat101 Beitrag anzeigen

      Ich möchte eine bestimmte Anzahl an Datenzeilen zwischen einem Indexbereich auslesen. Diese ausgelesenen Daten sollen in der Mitte des Datenbereichs liegen, sprich: (es geht um Objektdurchmesser)
      2 Abfrage (einmal <= und einmal > als der gesuchte Mittelwert) jeweils in die passende Richtung sortiert und LIMIT und diese mittels UNION verbinden. Wenn es darum geht, die N nächsten Einträge zu finden wäre eine KNN-Suche angebracht, die MySQL aber nicht kann.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        akretschmer hat es auf den Punkt gebracht...Leider kann MySQL mal wieder weniger als PostgreSQL

        ausgehend von folgender Situation:
        Code:
        CREATE TABLE diameter
            ( 
              diameter integer
            );
        
        INSERT INTO diameter
            (
             diameter
            )
        VALUES
            (8),
            (9),
            (12),
            (15),
            (16),
            (17),
            (19),
            (30),
            (54);

        Code:
        select * from
        (select diameter from diameter where diameter >= 15 order by diameter limit 3) A
        union all
        select * from
        (select diameter from diameter where diameter < 15 order by diameter  desc limit 2) B
        order by diameter

        Kommentar


        • #5
          protestix Danke dir für die Mühe aber wie bereits gesagt wollte ich diesen Weg nicht gehen, weil es einfach zu ungenau und ineffizient ist für diesen Fall

          akretschmer & kaminbausatz Vielen dank euch. Genau so eine Lösung habe ich gesucht! Funktioniert perfekt

          Vielen Dank und Liebe Grüße

          Kommentar


          • #6
            Hat jemand ein Beispiel wie das mit Postgresql (einfacher) klappt?

            Kommentar


            • #7
              KNN-Suche?

              Ich erzeuge eine Tabelle mit 100000 Einträgen der Form (id, Zufallszahl) und suche die 5 nächsten an z.B. 4711. Dazu wird der vorhandene GiST-Index genutzt, das <-> ist der Entfernungs-Operator:

              Code:
              test=# create table foo(id serial primary key, val int);
              CREATE TABLE
              test=*# insert into foo (val) select random()*10000 from generate_series(1, 100000) x;
              INSERT 0 100000
              test=*# create index idx_knn on foo using gist (val);
              CREATE INDEX
              
              test=*# explain analyse select *, 4711 <-> val from foo order by 4711 <-> val limit 5;
                                                                       QUERY PLAN                                                         
              ----------------------------------------------------------------------------------------------------------------------------
               Limit  (cost=0.28..0.56 rows=5 width=12) (actual time=0.197..0.217 rows=5 loops=1)
                 ->  Index Scan using idx_knn on foo  (cost=0.28..5508.28 rows=100000 width=12) (actual time=0.195..0.213 rows=5 loops=1)
                       Order By: (val <-> 4711)
               Planning time: 0.160 ms
               Execution time: 0.260 ms
              (5 Zeilen)
              
              test=*#

              Das geht auch bei 2 oder mehrdimensionalen Daten, also z.B. Geodaten, und der beliebten Frage: ich bin hier (GPS-Daten), wo ist der nächste Döner oder der nächste Puff?
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Zitat von akretschmer Beitrag anzeigen
                Das geht auch bei 2 oder mehrdimensionalen Daten, also z.B. Geodaten, und der beliebten Frage: ich bin hier (GPS-Daten), wo ist der nächste Döner oder der nächste Puff?
                Für die habe ich's auch in der Doku sofort gefunden, für normale Ints nicht.
                Danke dir für die Mühe. Lag bei mir daran das ich keinen gist-Index auf die Spalte hatte bzw. die btree_gist Extension gar nicht aktiv auf der DB.

                Kommentar


                • #9
                  Solange es bei den Werten bei einfachen Integer oder Float's bleibt ist die Suche nach den ersten x nächstliegenden Werten zu einer Referenz doch auch unter MySql kein Problem
                  Code:
                  SELECT diameter, abs(diameter - 15) as distance 
                  FROM diameter 
                  ORDER BY distance
                  LIMIT 5
                  Code:
                  "diameter"    "distance"
                  "15"          "0"
                  "16"          "1"
                  "17"          "2"
                  "12"          "3"
                  "19"          "4"

                  Kommentar


                  • #10
                    Zitat von jspit Beitrag anzeigen
                    Solange es bei den Werten bei einfachen Integer oder Float's bleibt ist die Suche nach den ersten x nächstliegenden Werten zu einer Referenz doch auch unter MySql kein Problem
                    ...funktioniert mit 15 ganz gut.

                    Kommentar


                    • #11
                      Zitat von jspit Beitrag anzeigen
                      Solange es bei den Werten bei einfachen Integer oder Float's bleibt ist die Suche nach den ersten x nächstliegenden Werten zu einer Referenz doch auch unter MySql kein Problem
                      Depends. Ich hatte 'nur' 100.000 Zeilen in der DB. Du must für jede Zeile zu dem Wert den Abstand berechnen. Schau in das Explain, da ist ein Index-Scan. Er holt aus dem Index den Abstand, muß ihn nicht erst berechnen. KNN.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        ist das mit "distance" und Abstand nicht der falsche Ansatz? Er möchte doch die nächsten 2 größeren Durchmesser und die vorherigen 2 kleineren Durchmesser, wobei die Spreizungen mit zunehmendem Durchmesser größer werden.

                        Kommentar


                        • #13
                          Ja, siehe #3 und weitere Diskussion, in #6 wurde dann nach einem Beispiel für KNN gefragt.
                          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                          Kommentar


                          • #14
                            Also ist der Wunsch des TE auch in PostgreSQL nur über die o.g. select Geschichte umsetzbar...

                            Kommentar


                            • #15
                              Zitat von kaminbausatz Beitrag anzeigen
                              ...funktioniert mit 15 ganz gut.

                              Genau! Zufall. Mein Beitrag bezog sich auch auf den Distanzanzatz. Die Aufgabenstellung #1 ist eine andere.

                              Mit der 19 liegt sieht das mit meinem Ansatz so aus

                              Code:
                              "diameter"    "distance"
                              "19"          "0"
                              "17"          "2"
                              "16"          "3"
                              "15"          "4"
                              "12"          "7"
                              Also ganz anders als im Beitrag #1 gezeigt.
                              Die Frage die sich stellt ist doch woher kommt diese Forderung
                              Diese ausgelesenen Daten sollen in der Mitte des Datenbereichs liegen,
                              und macht das Sinn?

                              Kann nicht ohne den Hintergrund/die Applikation zu kennen beantwortet werden.

                              akretschmer : Ist mir schon klar das solch ein Ansatz ab einer gewissen Anzahl Datensätze unter MySQL Probleme macht...

                              Kommentar

                              Lädt...
                              X