fritz85: MySQL Order By & Limit

hallo zusammen

ich habe eine sql abfrage und möchte nur 20 auslesen jedoch müssen die absteigend sortiert sein also DESC

mysql> SELECT * FROM inserat ORDER BY time DESC LIMIT 20;

ist dies ja nicht möglich - kennt da jemand eine Alternative bzw. eine andere Lösung?

Gruss
fritz85

  1. echo $begrüßung;

    ich habe eine sql abfrage und möchte nur 20 auslesen jedoch müssen die absteigend sortiert sein also DESC
    mysql> SELECT * FROM inserat ORDER BY time DESC LIMIT 20;
    ist dies ja nicht möglich - kennt da jemand eine Alternative bzw. eine andere Lösung?

    Wenn ich dich recht verstehe, möchtest du aus der unsortierten Menge 20 Datensätze haben (welche auch immer das sein werden) und die dann sortieren? Dann benötigst du ein Subquery:

    SELECT * FROM (SELECT * FROM inserat LIMIT 20) ORDER BY time DESC

    echo "$verabschiedung $name";

    1. Hello

      Wenn ich dich recht verstehe, möchtest du aus der unsortierten Menge 20 Datensätze haben (welche auch immer das sein werden) und die dann sortieren? Dann benötigst du ein Subquery:

      Genau das suche ich :-)

      SELECT * FROM (SELECT * FROM inserat LIMIT 20) ORDER BY time DESC

      Vielen Dank schonmal habe es eben ausprobiert jedoch ohne Erfolg es werden 0 anzeigt. Anscheinend will mein Query nicht so hehe :-)

      mysql> SELECT inserate.id FROM (SELECT inserate.id FROM inserate LIMIT 20) WHERE inserate.user LIKE '100' ORDER BY time DESC;

      hmm ?

      Gruss
      fritz85

      1. echo $begrüßung;

        Vielen Dank schonmal habe es eben ausprobiert jedoch ohne Erfolg es werden 0 anzeigt. Anscheinend will mein Query nicht so hehe :-)
        mysql> SELECT inserate.id FROM (SELECT inserate.id FROM inserate LIMIT 20) WHERE inserate.user LIKE '100' ORDER BY time DESC;

        Na, dann sind in den 20 zufälligen Datensätzen keine die deiner äußeren Bedingung entsprechen. Es wundert mich auch, dass kein Fehler beim Ansprechen von inserate.user kommt, denn im Subquery fragst du ja nur insertate.id ab. Und da die Subquery im äußeren FROM steht kann die äußere Abfrage auch nur auf die von der Subquery gelieferten Daten zugreifen. Vielleicht solltest du die Bedingung in den Datenlieferanten aufnehmen, also in die Subquery. Außerdem kann man nicht nach etwas sortieren, das nicht vorhanden ist (außer vielleicht MySQL).

        echo "$verabschiedung $name";

        1. Na, dann sind in den 20 zufälligen Datensätzen keine die deiner äußeren Bedingung entsprechen. Es wundert mich auch, dass kein Fehler beim Ansprechen von inserate.user kommt, denn im Subquery fragst du ja nur insertate.id ab. Und da die Subquery im äußeren FROM steht kann die äußere Abfrage auch nur auf die von der Subquery gelieferten Daten zugreifen. Vielleicht solltest du die Bedingung in den Datenlieferanten aufnehmen, also in die Subquery. Außerdem kann man nicht nach etwas sortieren, das nicht vorhanden ist (außer vielleicht MySQL).

          Wo muss denn die WHERE Abfrage stehen im Subquery oder im normalen Query? Verstehe noch nicht ganz wie ich das zusammen verknüpfen kann :-(

          Gruss

          1. Mahlzeit fritz85,

            mysql> SELECT inserate.id FROM (SELECT inserate.id FROM inserate LIMIT 20) WHERE inserate.user LIKE '100' ORDER BY time DESC;

            Na, dann sind in den 20 zufälligen Datensätzen keine die deiner äußeren Bedingung entsprechen. Es wundert mich auch, dass kein Fehler beim Ansprechen von inserate.user kommt, denn im Subquery fragst du ja nur insertate.id ab. Und da die Subquery im äußeren FROM steht kann die äußere Abfrage auch nur auf die von der Subquery gelieferten Daten zugreifen. Vielleicht solltest du die Bedingung in den Datenlieferanten aufnehmen, also in die Subquery. Außerdem kann man nicht nach etwas sortieren, das nicht vorhanden ist (außer vielleicht MySQL).

            Wo muss denn die WHERE Abfrage stehen im Subquery oder im normalen Query?

            Was genau hast Du an "Vielleicht solltest du die Bedingung in den Datenlieferanten aufnehmen, also in die Subquery." nicht verstanden? SQL-Abfragen werden von innen nach außen abgearbeitet. Wenn also die innere Abfrage nur die Spalte "inserate.id" liefert, wie soll dann die äußere Abfrage (die ja aus der Ergebnismenge, die die innere Abfrage erzeugt, weiter auswählt) dann dort eine Spalte "inserate.user" oder "time" finden?

            MfG,
            EKKi

            PS: Was hat die Problemstellung eigentlich mit PHP zu tun?

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hello EKKi

              Was genau hast Du an "Vielleicht solltest du die Bedingung in den Datenlieferanten aufnehmen, also in die Subquery." nicht verstanden? SQL-Abfragen werden von innen nach außen abgearbeitet. Wenn also die innere Abfrage nur die Spalte "inserate.id" liefert, wie soll dann die äußere Abfrage (die ja aus der Ergebnismenge, die die innere Abfrage erzeugt, weiter auswählt) dann dort eine Spalte "inserate.user" oder "time" finden?

              Also ist das Problem welches ich habe effektiv nur mit einem Subquery möglich?

              Ich hab ja folgenden Query:

              mysql> SELECT inserate.id FROM inserate WHERE inserate.user LIKE '100' ORDER BY time DESC;

              Wenn ich folgenden Query mache bringt er mir alle Inserate welche dem User 100 gehören sortiert nach Aufgabedatum absteigend. Dies funktioniert und ist schon mal toll.

              Jedoch möchte ich nun NUR 20 anzeigen lassen und bin ich nun einfach zu doof um dieses Subquery zu verstehen??

              gruss
              fritz85

              1. echo $begrüßung;

                Also ist das Problem welches ich habe effektiv nur mit einem Subquery möglich?

                Die Reihenfolge der Klauseln eines SELECT-Statements geben im Wesentlichen die Abarbeitungsreihenfolge an. FROM (inklusive JOIN) ermittelt die zu verwendeden Tabellen. WHERE selektiert die zu berücksichtigenden Datensätze. GROUP BY und HAVING lass ich mal weg. Nun werden die Spalten nach dem SELECT ausgewertet und gegebenenfalls die dort angegebenen Berechnungen durchgeführt. Dann wird gemäß ORDER BY sortiert. Abschließend wird die Ergebnismenge LIMITiert.

                Wenn du eine andere Abarbeitungsreihenfolge benötigst, so wie sich das in deiner Anfrage las, brauchst du einen Workaround. Erst limitieren und anschließend sortieren geht nicht direkt. Dazu muss zuerst das limitierte Zwischenergebnis ermittelt werden. Dieses muss aber alle Daten enthalten, die du für den nächsten Schritt benötigst. Zu wenig nützt dir nichts, zu viel ist Verschwendung, wenn die überschüssigen Daten ungenutzt bleiben.

                mysql> SELECT inserate.id FROM inserate WHERE inserate.user LIKE '100' ORDER BY time DESC;
                Wenn ich folgenden Query mache bringt er mir alle Inserate welche dem User 100 gehören sortiert nach Aufgabedatum absteigend. Dies funktioniert und ist schon mal toll.
                Jedoch möchte ich nun NUR 20 anzeigen lassen und bin ich nun einfach zu doof um dieses Subquery zu verstehen??

                Möchtest du von dem, was diese Abfrage in dieser Reihenfolge liefert die erstan 20 haben, also die 20 neuesten? Dann musst du nur daran ein LIMIT 20 anhängen. Dann wäre das aber genau deine Ausgangsabfrage, die ja angeblich nicht geht. Deiner Aussage auf meine Nachfrage zufolge wolltest du aber 20 beliebige Datensätze aus der unsortierten Menge und die dann sortieren. Ich denke, du solltest nochmal überlegen, was du nun genau willst. Vielleicht hilft es dir, dir vorzustellen, die Datensätze wären auf Papierkarteikarten. Was must du nun in welcher Reihenfolge tun, um an dein gewünschtes Ergebnis zu kommen?

                echo "$verabschiedung $name";

  2. Hi!

    mysql> SELECT * FROM inserat ORDER BY time DESC LIMIT 20;

    ist dies ja nicht möglich

    Was meinst Du mit nicht möglich?
    Ich sehe da keinen Fehler.
    Kommt da ne Fehlermeldung, wenn ja: welche?

    off:PP

  3. Hallo

    ich habe eine sql abfrage und möchte nur 20 auslesen jedoch müssen die absteigend sortiert sein also DESC

    mysql> SELECT * FROM inserat ORDER BY time DESC LIMIT 20;

    ist dies ja nicht möglich

    seit wann das? Das hier schluckt selbst ein betagtes MySQL 3.23

    • kennt da jemand eine Alternative bzw. eine andere Lösung?

    für welches Problem?
    Es kann sein, dass ich Dich nicht verstanden habe. Bitte ein paar Beispieldatensätze und die gewünschte Ergebnismenge mit der Begründung. Fünf Datensätze und drei in der Ergebnismenge wären ja ausreichend.

    Freundliche Grüße

    Vinzenz