abfrage mit limits

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

  • abfrage mit limits

    Hallo!

    ich habe eine Tabelle, mit den Spalten: "id", "bild_url", "bewertung", "zeitpunkt_upload" und "zusatz".
    In der Spalte "bewertung" steht eine Integerzahl, und in "zusatz" kann entweder 1, 2 oder 3 drin stehen (oder auch "n1", aber das hat hiermit nichts zu tun). Das ist sozusagen eine Art Kategorie.
    Nun möchte ich eine Rangliste erstellen (Platz 1 - 300). Allerdings mit der Besonderheit, dass Bilder, die in der Spalte "zusatz" eine 2 oder eine 3 haben, auf jeden Fall in der Rangliste vorkommen müssen. Die id´s der Datensätze mit den zusätzen 2 oder 3 sind bekannt, es sind die id´s 1 - 20 (es sind also nur 20 Bilder, 15 mit zusatz 2, und 5 mit zusatz 3). Alle anderen Datensätze, die 1 als zusatz haben, bekommen per auto increment ihre id.
    Wenn es zum Beispiel 280 Bilder mit dem zusatz 1 gibt, und ich eine Rangliste mit den Plätzen 1 - 300 erstellen möchte, ist das ganze kein Problem, da es insgesamt nicht mehr wie 300 Datensätze gibt.
    PHP-Code:
    $query "SECELCT bild_url FROM bilder
    WHERE zusatz = 1 or zusatz = 2 or zusatz = 3
    ORDER BY bewertung ASC, zeitpunkt_upload DESC
    LIMIT 300"

    Nun aber ein anderes Beispiel:
    Es sind mehr als 280 Bilder mit dem zusatz 1 drin (z.B. 300 Stück), diese haben alle eine bewertung von "400". Die 20 Bilder mit den zusätzen 2 oder 3 haben alle eine Bewertung von 200.
    Bei obiger Abfrage würden die letzten 20 Bilder nicht mehr auftauchen, und das darf nicht sein. In diesem Fall müssen die Bilder dann die Plätze 281 - 300 belegen.
    Wenn bei gleichem Beispiel allerdings eins der 20 Bilder eine Bewertung von 600 hat, dann muss dieses auch Platz 1 belegen, die anderen 19 dann die Plätze 282 - 300.
    Mit anderen Worten soll die Rangliste auf jeden Fall aus 280 Bildern mit dem zusatz 1 bestehen, und dann die 20 Bilder mit den zusätzen 2 und 3. Diese müssen dann nach bewertung und zeitpunkt_upload sortiert sein, wobei die 20 Bilder auf jeden Fall vorkommen müssen, notfalls auf den letzten Plätzen.
    Im grude brauche ich also folgende Abfrage:
    {SELECT... WHERE zusatz = 1 ORDER BY bewertung... LIMIT 280;
    SELECT... WHERE zusatz = 2 OR zusatz = 3 ORDER BY ... LIMIT 20;} ORDER BY bewertung... ;
    In Worten : Von denen mit zusatz 1 die 280 mit der höchsten bewertung nehmen, dann die 20 mit den zusätzen 2 und 3 dazupacken, und das ganze dann nochmals sortieren.

    eine entsprechende abfrage, oder ein ansatz, wie ich das in php löse, kriege ich einfach nicht hin..... Hat einer eine Idee?

    Mfg,
    Stefan

  • #2
    Re: abfrage mit limits

    Ich würde IF benutzen, um bei zusatz=2 oder 3 die Bewertung auf den größtmöglichen/einen sehr großen Wert zu setzen, und bei den anderen auf den tatsächlichen Bewertungswert - und dann danach absteigend sortieren.

    Falls der Bewertungswert für die 2er und 3er auch erhalten bleiben soll, dann eben eine zusätzliche Pseudo-Spalte dafür nutzen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Die Idee ist echt gut. Denn wenn ich die Bewertung auf z.B. eine Millionen setzte, kann man auf jeden Fall davon ausgehen, dass die 20 Bilder dabei sind. Aber anschließend muss ich die dann erhaltenen 300 Datensätze ja nach den tatsächlichen Bewertungen sortieren. Denn der Bewertungswert für die 2er und 3er _muss_ erhalten bleiben.
      Dann habe ich wieder das Problem, dass ich zwei mal sortieren muss.....
      Wenn von den 2er Bildern eins mit 600, und eins mit 500, und der Rest mit 100 bewertet ist, und von den 1er das höchste mit 700, das folgende mit 400 bewertet ist und der Rest (500 Stück) mit 200, dann muss sich folgendes ergeben:
      Platz 1: 700 (1er)
      Platz 2: 600 (2er)
      Platz 3: 500 (2er)
      Platz 4: 400 (1er)
      Platz 5 - 283: 200 (1er)
      Platz 284 - 300: 100 (2er + 3er)

      Mfg,
      Stefan

      Kommentar


      • #4
        Wenn deine MySQL-Version schon Subqueries unterstützt - dann könntest du ja erstmal die richtigen Bilder auswählen, und dann noch nach der tatsächlichen Bewertung sortieren.

        Andernfalls kannst du die tatsächliche Sortierung ja ggf. auch in der Verarbeitung vornehmen.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Hallo!
          ich bin jetzt endlich dazu gekommen, eine höhere MySQL Version (5)einzurichten, die auch subqueries unterstützt.
          Allerdings habe ich immer noch keine lösung gefunden....
          Ich habe mich jetzt etwas in das Thema subqueries eingearbeitet, aber ich komme einfach nicht drauf, wie das damit zu lösen ist.
          Wie sieht eine solche query aus, mit der ich erst die richtigen Bilder auswähle (also 280 von den 1er sortiert nach bewertung), und dann mit den 20 anderen (2er und 3er) zusammen sortiere?

          Mfg,
          Stefan

          Kommentar


          • #6
            Original geschrieben von KleinesOnlein29

            Wie sieht eine solche query aus, mit der ich erst die richtigen Bilder auswähle (also 280 von den 1er sortiert nach bewertung), und dann mit den 20 anderen (2er und 3er) zusammen sortiere?
            subqueryideen:

            PHP-Code:
            $query1 "SELECT bild_url,bewertung FROM bilder
            WHERE zusatz = 1 or zusatz = 2 or zusatz = 3
            ORDER BY if(zusatz=2 or zusatz=3, bewertung+100000, bewertung) DESC, 
            zeitpunkt_upload DESC
            LIMIT 300"
            ;


            $query1 "SELECT bild_url,bewertung FROM bilder
            WHERE zusatz = 1 or zusatz = 2 or zusatz = 3
            ORDER BY zusatz DESC, bewertung DESC, zeitpunkt_upload DESC
            LIMIT 300"
            ;


            $query2 "SELECT bild_url FROM 
               (SELECT bild_url,bewertung FROM bilder
            WHERE zusatz = 1 or zusatz = 2 or zusatz = 3
            ORDER BY zusatz DESC, bewertung DESC, zeitpunkt_upload DESC LIMIT 300)
              ORDER BY bewertung DESC"
            ;


            $query2 "SELECT bild_url FROM ($query1) ORDER by bewertung DESC"
            Anstatt der Subquery lassen sich die 300 url+Bewertung auch in php sortieren,
            aber ich vermute dass mysql die subquery auch recht macht.

            im konkreten Fall kann man entweder die Bewertung um 100000 erhöhen, wie im
            ersten Beispiel, oder nach zusatz DESC sortieren.....

            Kommentar

            Lädt...
            X