php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 14-09-2006, 15:44
KleinesOnlein29
 Newbie
Links : Onlinestatus : KleinesOnlein29 ist offline
Registriert seit: Jun 2006
Beiträge: 45
KleinesOnlein29 ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 14-09-2006, 16:19
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard 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.
Mit Zitat antworten
  #3 (permalink)  
Alt 14-09-2006, 17:50
KleinesOnlein29
 Newbie
Links : Onlinestatus : KleinesOnlein29 ist offline
Registriert seit: Jun 2006
Beiträge: 45
KleinesOnlein29 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 14-09-2006, 17:57
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 27-09-2006, 21:10
KleinesOnlein29
 Newbie
Links : Onlinestatus : KleinesOnlein29 ist offline
Registriert seit: Jun 2006
Beiträge: 45
KleinesOnlein29 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 27-09-2006, 22:56
sternm
 Banned
Links : Onlinestatus : sternm ist offline
Registriert seit: Sep 2006
Beiträge: 103
sternm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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.....
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:21 Uhr.