SQL Position des Datensatzes?

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
846
Hallo,

und zwar möchte ich gern eine Art Tabelle aufbauen, die mir sagt, das Datensatz X an 7.Position ist.

Ich habe dafür aktuell folgenden SQL-Befehl:

PHP:
SELECT count(*) AS Anzahl, user_id FROM list GROUP BY user_id ORDER Anzahl DESC

Durch vergleichen (in PHP) der User-ID kann ich die Abfrage "pausieren", indem ich bei Übereinstimmung der eingeloggten User-ID mit der Ausgabe der SQL-Abfrage ein "break;" einfüge und die Platzierung sozusagen über eine Variable immer um eins addiere.

Die obige DB-Abfrage verbraucht aber viel DB-Last. Kann man das Ganze etwas einfacher stricken?
 
count * ist dein problem.

Du kannst doch in der Schleife in dem du das Ergebnis liest eine integer hochzählen.
So nach dem motto:
$count = 1;
while ($row = mysql_fetch_array($result))
{
// do something
$count++;
}

Darf ich fragen was du damit eigentlich genau vor hast?

mfg
 
Schumiel schrieb:
...
PHP:
SELECT count(*) AS Anzahl, user_id FROM list GROUP BY user_id ORDER Anzahl DESC
...
Die obige DB-Abfrage verbraucht aber viel DB-Last. Kann man das Ganze etwas einfacher stricken?

Wenn obige Abfrage viel DB-Last erzeugt, dann sollte wohl auf die Spalte user_id ein Index drauf. Ansonsten muss er nämlich die ganze Tabelle wälzen, um die Zählerei abzuwickeln.
 
Auf user_id ist ein Index drauf. Und die Abfrage dauert 1,4 Sekunden. :(

Und zwar macht jeder User_id einen Eintrag. Umso mehr Einträge, desto eine höhere Position hat er.

Beispiel:
User_id 1 hat 4 Einträge.
User_id 2 hat 5 Einträge.
User_id 3 hat 2 Einträge.
User_id 4 hat 8 Einträge.

Also habe ich insgesamt 19 Datensätze.

Loggt sich User_id 4 ein, muss er da stehen haben, das er die 1.Position inne hat. Für die anderen User_id's eben ihre Positionen. Das mache ich mit der obigen Abfrage, die jedoch viel zu lang dauert. :(
 
Schreibst du gerade sowas wie ein Forum oder ein Gästebuch?
 
Nein. Ich will nur eine Liste ausgeben lassen, wie oft ein User Einträge in der einen Datenbanktabelle hat. :)
 
Also an für sich sieht die Anfrage für mich nach linearem Aufwand aus... kann also nicht so schlimm sein... Es sei denn die Tabelle ist exorbitant groß.

Vielleicht solltest du dir dann überlegen für jeden User einen counter der Einträge und eine Position mitzupflegen... kann kannst du direkt selektieren und musst halt bei jedem Eintrag nur prüfen ob der counter des nächsthöheren Eintrags übertroffen wurde.
 
die user tabelle im 2 spalten erweitern z.B.: position und counter
einen index auf position erstellen wenns schneller gehen soll
beim einfügen eines neuen tupels in die tabelle list:
1. benutzer nach id suchen
2. benutzer position-1 suchen
3. Wenn benutzer an position-1 eingeholt wurde dann positionen aktualisieren ansonsten nur counter erhöhen.

beim auslesen der benutzerposition brauchst du dann nur noch den benutzerdatensatz in der user tabelle suchen und schauen was bei attribut position steht...
 
Das ist leider so nicht möglich, da sich die Daten sekündlich aktualisieren. Ich bin immer noch auf der Suche nach einer Lösung.
 
Klingt für mich, genau wie lararsc, als solltest du einen cache-value einbauen, also anstatt jedesmal zu zählen wieviele Einträge der User hat, speicherst du das mit. Auch wenn die Daten sekündlich geändert werden, ist das kein Problem. Da ich aus deinem SQL-Code nicht herauslesen kann, zeige ich dir folgendes Beispiel:

Es soll nach Usern gesucht werden, deren Name mit dem übergebenen beginnt und die Sortierung soll absteigend nach der Anzahl der Fotos des Users sein.
So würde es primitiv aussehen:
Code:
SELECT user.name, COUNT(*) AS fotos
FROM user
LEFT JOIN user_fotos ON(user_fotos.userid = user.id)
WHERE user.name = 'Schum%'
GROUP BY user.id
ORDER BY COUNT(*) DESC
Das ist so ungefähr wie dein Query, aber eben ineffizient, wir verbessern dies, indem wir uns die Anzahl der Fotos merken:
Code:
ALTER TABLE user ADD COLUMN fotos int
Jedesmal wenn, ein Foto hinzugefügt oder gelöscht wird, aktualisiert man den Wert, die Suche ist dann ganz einfach:
Code:
SELECT name, fotos FROM user WHERE name = 'Schum%' ORDER BY fotos DESC
Und wenn du dies nicht immer manuell aktualisieren willst, kannst du auch Trigger nutzen ;)
 
Zuletzt bearbeitet:
Zurück
Oben