[php/mysql] hoogste 5 rijen per waarde selecteren.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DShadow
  • Registratie: Mei 2007
  • Laatst online: 13-04-2024
Ik wil van onderstaande voorbeeld van elke waarde in kolom a de hoogste 5 waardes in kolom b krijgen

Dus de waardes 1;1/5 2;1/5 3;1/5

ab
11
12
13
14
15
16
21
22
23
24
25
26
31
32
33
34
35
36


Ik heb daarvoor dit script geschreven maar kan dit lijkt mij niet echt efficïent. Is er nog een betere manier.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql1 = "SELECT DISTINCT a FROM test ORDER BY a";
$result1 = mysql_query($sql1);
$row1 = mysql_fetch_array($result1)

$sql2 = "(SELECT * FROM test WHERE a = ".$row1["a"]." ORDER BY b LIMIT 5)";
while($row1 = mysql_fetch_array($result1))
  {
  $sql2 = $sql2." UNION ALL (SELECT * FROM test WHERE a = ".$row1["a"]." ORDER BY b LIMIT 5)"
  }

$result2 = mysql_query($sql2);
while($row2 = mysql_fetch_array($result2))  
   {
   print_r($row2)
   }
?>
 

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Ik denk dat je dit bedoeld, maar misschien begrijp ik je vraag niet goed.

[code=sql]SELECT MAX(`b`) FROM `table` GROUP BY `a`[/code]

Edit: Nee je hebt er dus 5 nodig

[code=sql]SELECT * FROM `table` ORDER BY `a` ASC, `b` ASC[/code]


Hmmm, ik begrijp dat je dit graag in 1 query wil?

[ Voor 38% gewijzigd door TheNephilim op 14-06-2010 13:48 ]


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

De typische oplossing voor dit probleem is het gebruik van een window function. Al betwijfel ik of MySQL dat ondersteund.

Je kan het natuurlijk vrij eenvoudig emuleren met 5 joins. Is dat een optie misschien?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • DShadow
  • Registratie: Mei 2007
  • Laatst online: 13-04-2024
Wolfboy schreef op maandag 14 juni 2010 @ 14:16:
De typische oplossing voor dit probleem is het gebruik van een window function. Al betwijfel ik of MySQL dat ondersteund.

Je kan het natuurlijk vrij eenvoudig emuleren met 5 joins. Is dat een optie misschien?
Hoe zou dat er uit zien?

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Dan krijg je zoiets:

SQL:
1
2
3
4
5
6
7
8
9
SELECT t0.a, MIN(t0.b), MIN(t1.b), MIN(t2.b), MIN(t3.b), MIN(t4.b)
FROM test AS t0
JOIN test AS t1 ON t0.a = t1.a AND t0.b < t1.b
JOIN test AS t2 ON t0.a = t2.a AND t1.b < t2.b
JOIN test AS t3 ON t0.a = t3.a AND t2.b < t3.b
JOIN test AS t4 ON t0.a = t3.a AND t3.b < t4.b

GROUP BY t0.a
ORDER BY t0.a, MIN(t0.b), MIN(t1.b), MIN(t2.b), MIN(t3.b), MIN(t4.b)

[ Voor 10% gewijzigd door Wolfboy op 14-06-2010 15:00 ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 17:24

BCC

Als je erg veel data hebt, zou ik het in losse queries doen dus 5x:
SELECT b FROM 'table' WHERE a=1 ORDER BY b DESC, LIMIT 5
Met een index op a,b zal dat loei snel zijn, want dat kan uit de index beantwoord worden.

Als je tabel in zijn geheel vrij klein is, kun je ook gewoon alles selecteren, sorten op a,b en dan in php steeds de eerste 5 b's laten zien per a.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • DShadow
  • Registratie: Mei 2007
  • Laatst online: 13-04-2024
dit is alleen een voorbeeld de database zelf is 2000 tot 3000 rows op dit moment.

Met een stuk of 60 verschillende waardes in kolom A maar hier worden er eigenlijk nooit meer dan 15 tegelijk van gequeried.

Edit: spelfouten verbeterd

[ Voor 8% gewijzigd door DShadow op 15-06-2010 14:42 ]

Pagina: 1