Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

mysql - nur einen Datensatz aus einer Selection ausgeben ?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Vorstaedter, 13 April 2016.

  1. Vorstaedter

    Vorstaedter Benutzer

    Hallo, bestimmt ein simples Problem, aber ich kriege es nicht gelöst :

    Ich habe eine Datenbanktabelle "beispiel" mit z.B. 3 Feldern A, B und C und einem Indexfeld id als Primärschlüssel.
    Für den Primärschlüssel kann ich zwar die Einmaligkeit, aber keine bestimmte Reihenfolge und keine Lückenlosigkeit sicherstellen. id ist auch NICHT das Sortierkriterium für die Tabelle.
    Ein Suchbegriff z.B. für Feld A stehe in der Variablen $a.
    Das folgende ist banal und funktioniert :

    $res = mysqli_query($con, " select * from beispiel where A = $a");
    while ($ausgabe = mysqli_fetch_array($res);
    {
    echo " ausgabe[A], ausgabe, ausgabe[C]";
    }

    Damit erhalte ich eine Liste aller Datensätze, die in die gegebene Selektion passen, sofern $a in Feld A mehrfach vorkommt.

    Ich will aber NUR EINEN Datensatz ausgeben, kann den aber nicht über ein
    where id = irgendwas in der query selektieren wegen der Unregelmäßigkeiten in der id-Reihenfolge.
    Wie muß ich die Zeile while .... abändern, so daß nur ein Datensatz, z.B. 5. ausgegeben wird.

    Unter vielem anderem habe ich z.B. probiert :
    $ausgabe = mysqli_fetch_array($res)[5];
    aber außer Fehlermeldungen und / oder kruden Ausgaben kommt da nichts .....



    Warum ist der Text plötzlich fett geworden ?
     
  2. akretschmer

    akretschmer Datenbank-Guru

  3. ukulele

    ukulele Datenbank-Guru

    LIMIT 1 wäre der erste Datensatz vom Ergebnis. Welcher ist unbestimmt solange du nicht mit ORDER BY arbeitest. Ein ORDER BY stört sich nicht an "Lücken" in der Reihenfolge, nur wenn die ID nicht aufsteigend ist macht es keinen Sinn danach zu sortieren, dann müssen andere Kriterien her. Wenn es nicht der erste sondern der 5te Datensatz sein soll musst du zusätzlich zu LIMIT und ORDER BY mit OFFSET arbeiten.
     
  4. Vorstaedter

    Vorstaedter Benutzer

    Herzlichen Dank für die rasche Antwort !
    Sieht vielversprechende aus .
    Habe hier zwar ein dickes Buch zu PHP und MYSQL, aber der Begriff "LIMIT" kommt darin nicht vor .
    Liegt mein Problem denn so am Rande, daß die LIMIT und Offset darin nicht erwähnt wird, oder hab ich nur ein doofes Buch erwischt ?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du hast vor allem mit MySQL eine doofe DB erwischt.
     
  6. Vorstaedter

    Vorstaedter Benutzer

    Da stellen sich mir aber die Ohren hoch ...
    es geht um eine Datenbank als "Rückgrat" für eine WEB-Seite, und da hab ich eine Frage :
    Die Datenbank stellt mir ja letzendlich mein Provider zur Verfügung, sein Angebot ist also für mich das "Maß aller Dinge"; er bestimmt letztlich, was funzt und was nicht. Wenn wir mal den Spruch " dann such Dir nen anderen Provider" beiseite lassen, was kann ich an den Thema tun ?
    Und wenn schon Providerwechsel, was sind die Kriterien um "den Besten" zu finden ?
    Local läuft bei mir als Entwicklungsumgebung XAMPP mit Maria DB und PHP7.0. Bin ja schon heilfroh, daß es dadurch noch keine Probleme beim Transfer auf meinen WEB-Space gegeben hat.
    Aber welche Bessere Lösung bietest Du an ?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Nun, laß es mich mal so sagen:

    Ich habe 5 1/2 Jahre im Support eines Providers gearbeitet (seit 2 Wochen nicht mehr, dazu später) und kenne die Situation, daß fast alle bei Datenbanken zuerst (und fast ausschließlich) an MySQL oder Derivate wie MariaDB denken. Das mag für eine Vielzahl von Projekten am Anfang auch ganz okay sein. Ich hab aber eher Kunden betreut, die 'etwas' größer waren, wo die Datenbanken dann recht schnell auch größer waren und oft auch der Wunsch bestand, komplexere Abfragen auszuführen und moderne Datenbankfeatures zu nutzen - und da ist man dann halt mit MySQL und Konsorten in einer Sackgasse. Dinge wie Check-Constraint oder komplexere Constraints - Fehlanzeige. Index-Features wie partielle und funktionale Indexe, GIN, GiST, BRIN und weiter - bei MySQL unbekannt. Analytische Auswertungen wie Window-Funktionen - ebenfalls Fehlanzeige. Kostenbasierter Optimizer, 'richtiges' Explain, Costs-per-Tablespace, Tablespaces überhaupt, komplexe Datentypen und selbst definierte Datentypen - in MySQL alles Fremdwörter. NoSQL-Features wie HSTORE und JSONB - negativ.

    Ja, die Datenbank ist das Rückgrat einer jeden Anwendung - dumm nur, wenn die Anwendung wächst und das Rückgrat verkümmert und nicht mitwachsen kann.

    Und dabei wäre es so einfach, gleich von Start an auf eine DB zu setzen, die all die oben genannten Dinge kann - und dabei noch freier (im Sinne der Lizenz) ist als MySQL: PostgreSQL. Seit 2 Wochen bin ich in einer Firma, die dann u.a. auch Kunden bei der Migration von MySQL zu PG begleitet ;-)
     
  8. ukulele

    ukulele Datenbank-Guru

    Und nebenbei gesagt LIMIT gehört auch in ein Buch über MySQL, so ein paar Dinge kann das ja auch :)
     
  9. Vorstaedter

    Vorstaedter Benutzer

    OK; für die wirklichen Fachleute, zu denen ich sicher nicht gehöre, sind das bestimmt gewichtige Argumente.
    Als Hobby- WEB-Designer, der viele Jahre alleine mit HTML, CSS und ein bißchen JS gelebt hat, ist der Einstieg in PHP + Datenbank schon einigermaßen anspruchsvoll und, wie ja auch dieser Threat zeigt, nicht frei von typischen Einsteigerproblemen.
    Auf meinem Niveau bin ich sicherlich bis auf weiteres noch nicht an den Grenzen von MySQL, geb Dir aber recht, daß man frühzeitig auf das bessere Pferd steigen sollte, so es denn verfügbar ist. Und damit sind wir wieder beim Provider - und für den Hobbyisten natürlich auch beim Preis.
    Ich frag mich ja schon, wie ich für lausige 2,50 WEBspace im GB-Bereich bekomme + Datenbanken + Statistik, freue mich aber natürlich daß es so ist .......
    Aber das Bessere ist immer der Feind des Guten .... und habe ein offenes Ohr !
     
  10. frank11

    frank11 Benutzer

    Mal eine grundsätzliche Frage zu Deinem Problem, nur zum Verständnis:
    Welchen Sinn hat es, nur EINEN Datensatz auszugeben, wenn offenbar mehrere Datensätze das Suchkriterium erfüllen?
     
  11. Vorstaedter

    Vorstaedter Benutzer

    Was ich anzeigen will ist jeweils die Seite eines Logbuches - also Tagesaufzeichnungen während einer (Segel-)Reise. Dies Aufzeichnungen sind strukturiert und finden für jeden Tag innerhalb mehrerer Tabellen statt. Dabei wird nicht unbedingt jeden Tag in jede Tabelle etwas geschrieben und es können auch ganze Tage ausfallen ( wenn z.B. ein fauler Logbuchschreiber am Werk ist ...)
    Ich habe also kein sicheres Suchkriterium um einen solchen Satz aufzufinden.
    Mein Lösungsansatz : Eine Query auf alle Tage einer Reise und diese dann sequentiell mit Limit 1 und fortlaufendem Offset nacheinander betrachten , d.h. heißt, meine Selektion umfasst alle Reisetage, sehen will ich die aber einzeln nacheinander....

    Und dazu gleich noch eine Frage :

    Wählt der Betrachter als Startdatum einen Tag mitten im Reiseverlauf, so muß ich dessen Position in der Sequenz ermitteln ( also seinen Offset ) um dann sequentiell weiter blättern zu können.
    Wie krieg ich denn den aktuellen Offset ???
     
  12. ukulele

    ukulele Datenbank-Guru

    Du solltest deine Suchkriterien mit dem Startdatum erweitern, also WHERE datum >= startdatum und dann fängst du wieder bei Seite 1 an.
     
  13. Vorstaedter

    Vorstaedter Benutzer

    Da kann ich dann aber nur vorwärts blättern ...
     
  14. frank11

    frank11 Benutzer

    möglicher Denkansatz:

    WHERE datum >= curdate()

    curdate() liefert das aktuelle Datum zurück, siehe hier
     
  15. ukulele

    ukulele Datenbank-Guru

    Dann wirst du mit einem Subselect oder einem seperaten Query gegen die DB zunächst die Seitennummer holen müssen um diese dann als OFFSET in dein Statement zu holen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden