Rank door één query
Ik heb bijvoorbeeld een kolom 'posts' in een tabel en ik wil achterhalen op welke plaats degene met het id 14 staat in de 'highscore' van het posten.
ja sorteren op het aantal posts.
Ja, maar dan ga je alle mensen selecteren en maak je daar een lijst van. Ik wil met één query de positie van iemand in die lijst bepalen, zonder dat je een heleboel records selecteert.
Niet dat ik weet
<username1> 1
<username2> 1
<username3> 1
<username4> 1
query1:
SELECT posts FROM tabel WHERE id='je_gekozen_id'
In de 2e query ga je werken met het aantal posts dat je uit de 1e kreeg:
SELECT count(id) AS positie FROM tabel WHERE posts <= 'waarde_uit_vorige_query'
Snap je waar ik heen wil?
EDIT:
Ik weet dat je eigenlijk met 1 query wou, maar dat gaat volgens mij niet lukken.. Je moet eerst het aantal hebben van diegene met het door jou gekozen id, en dan moet je met dat aantal kijken hoeveel er hoger zijn..
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Edit:
Dat werkt, totdat ik mensen krijg met hetzelfde aantal posts. Ik heb namelijk 32 users, waarvan een flik aantal zonder posts. Als ik kijk op welke plaats één van de users zonder posts staat. is dat 33, terwijl er maar 32 plaatsen zijn en die speler ook nog eens op een heel andere plaats staat :S
Edit:
Ik order die lijst trouwens op punten en daarna op id, zodat als er meerdere zijn met hetzelfde aantal posts, de nieuwste onderaan komt.
Gewijzigd op 01/01/1970 01:00:00 door - -
Mmmm, niemand weet nog iets anders zo te zien :'(
Of de unieke waarde nou het MAX() posts is, of het id van een user. Dit moet je in het stukje WHERE zetten.
Soms moet je dan subqueries gebruiken, maar zulke gegevens zijn altijd terug te halen. Ook zonder php-rompslomp.
* Wat voor database/versie heb je?
Ik weet ook het id van de user (uiteraard :P)
Eerst selecteer ik het aantal posts, dan selecteer ik de mensen met meer punten, dan selecteer ik de mensen met evenveel punten en een lager id. Die aantallen tel ik bij elkaar op. Dan krijg je de plaats :D
Hmmm, klinkt niet als de meest efficiente manier. Volgens mij kan dit met 1 query. Laat eens het datamodel zien.
datamodel?
En laat ook eens je oplossing zien? Is ten eerste voor sommige onder ons ook wel interressant om te zien, hoe jij dit hebt opgelost! En ten tweede, kunnen andere mensen, dit proberen te vereenvoudigen! ;)
Ojah, en datamodel, is de opzet van je database. De structuur zeg maar. Wat er in welke tabel staan enz. (Zeg ik het zo goed jongens ;)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
tabel users
id | naam | posts
1 | Herjan | 31
2 | Pietje | 11
3 | Flappie | 56
4 | Jantjuh | 11
id | naam | posts
1 | Herjan | 31
2 | Pietje | 11
3 | Flappie | 56
4 | Jantjuh | 11
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$sql1 = "SELECT posts FROM users WHERE id = 1 LIMIT 1"
$res1 = mysql_query($sql1);
// errorafhandeling
$row1 = mysql_fetch_array($res1);
$sql2 = "SELECT id, naam FROM users WHERE punten > ".$row1['posts'].""
$res2 = mysql_query($sql2);
// errorafhandeling
$sql3 = "SELECT id FROM users WHERE punten = ".$row1['posts']." AND id < ".$id.""
$res3 = mysql_query($sql3);
// errorafhandeling
$rank = mysql_num_rows($res2) + mysql_num_rows($res3);
if(mysql_num_rows($res[2]) == 0)
{
$rank++;
}
// Deze if is omdat het anders niet klopt :P
echo 'Gebruiker '.$row1['naam'].' staat op plaats '.$rank.'!';
?>
$sql1 = "SELECT posts FROM users WHERE id = 1 LIMIT 1"
$res1 = mysql_query($sql1);
// errorafhandeling
$row1 = mysql_fetch_array($res1);
$sql2 = "SELECT id, naam FROM users WHERE punten > ".$row1['posts'].""
$res2 = mysql_query($sql2);
// errorafhandeling
$sql3 = "SELECT id FROM users WHERE punten = ".$row1['posts']." AND id < ".$id.""
$res3 = mysql_query($sql3);
// errorafhandeling
$rank = mysql_num_rows($res2) + mysql_num_rows($res3);
if(mysql_num_rows($res[2]) == 0)
{
$rank++;
}
// Deze if is omdat het anders niet klopt :P
echo 'Gebruiker '.$row1['naam'].' staat op plaats '.$rank.'!';
?>