Rank door één query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- -

- -

24/06/2006 21:59:00
Quote Anchor link
Is het mogelijk om door één query zonder allemaal php-functies er omheen de positie in een lijst te achterhalen?

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.
 
PHP hulp

PHP hulp

17/11/2024 06:44:07
 
Kalle P

Kalle P

24/06/2006 22:01:00
Quote Anchor link
ja sorteren op het aantal posts.
 
- -

- -

24/06/2006 22:03:00
Quote Anchor link
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.
 
Eris -

Eris -

24/06/2006 22:04:00
Quote Anchor link
Niet dat ik weet
 
Frank -

Frank -

24/06/2006 22:08:00
Quote Anchor link
Voorbeeldje, niet getest:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
  COUNT(posts) AS aantal,
  username
FROM
  tabelnaam
GROUP BY
  username
ORDER BY
  aantal DESC
 
- -

- -

25/06/2006 12:30:00
Quote Anchor link
Uitkomst:

<username1> 1
<username2> 1
<username3> 1
<username4> 1
 
Robert Deiman

Robert Deiman

25/06/2006 12:46:00
Quote Anchor link
Met 2 query's kan gemakkelijk:

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
 
- -

- -

25/06/2006 12:51:00
Quote Anchor link
ok, dat ga ik ff proberen!

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 - -
 
- -

- -

25/06/2006 13:34:00
Quote Anchor link
Mmmm, niemand weet nog iets anders zo te zien :'(
 
Onbekend onbekend

onbekend onbekend

25/06/2006 14:13:00
Quote Anchor link
Je moet een unieke waarde weten. Dan kan je het altijd terug halen.

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?
 
- -

- -

25/06/2006 14:19:00
Quote Anchor link
Ik heb MySQL 4.1.18-standard draaien.

Ik weet ook het id van de user (uiteraard :P)
 
- -

- -

25/06/2006 15:55:00
Quote Anchor link
Ik heb het anders opgelost.

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
 
Frank -

Frank -

25/06/2006 15:58:00
Quote Anchor link
Hmmm, klinkt niet als de meest efficiente manier. Volgens mij kan dit met 1 query. Laat eens het datamodel zien.
 
- -

- -

25/06/2006 16:04:00
Quote Anchor link
datamodel?
 
Davy Jansen

Davy Jansen

25/06/2006 16:42:00
Quote Anchor link
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! ;)
 
Davy Jansen

Davy Jansen

25/06/2006 16:43:00
Quote Anchor link
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 ;)
 
- -

- -

25/06/2006 18:22:00
Quote Anchor link
ah, op die fiets :P

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
tabel users

id | naam    | posts
1  | Herjan  | 31
2  | Pietje  | 11
3  | Flappie | 56
4  | Jantjuh | 11


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.'!';

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.