[php] Waardes uit arrays tellen

Pagina: 1
Acties:

  • Quibus
  • Registratie: November 2000
  • Laatst online: 12:26
Ik ben bezig met een scriptje om te kijken hoeveel mensen in een bepaalde range zitten met het aantal berichten dat ze gepost hebben op t forum. Bijvoorbeeld: Aantal mensen met 0 - 49 berichten: 3 Aantal met 50 - 99 berichten: 1 etc. Nu denk je misschien nou dan maak ik een while loopje en tel alle waarden met SQL queries, maar dit geeft al snel 200 queries. Daarom bedacht ik, als ik nu alle posts in een keer (gesorteerd van laag naar hoog) in een array zet, dan tel ik ze dan een voor een. Ik ben toen ijverig gaan coden maar toen ik het eerste stukje af had stuitte ik al op een probeem:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<? 
//Stel de array met de waardes vast
$post_array = array(3, 4, 70, 110, 220, 234, 244);
$member['POST_COUNT'] = 0;

//ga iedere waarde in array langs
foreach($post_array as $post_value) 
{
  // Alle waardes <1000 moeten verdeelt worden in 'stukjes' van 50  
  if ($post_value < 1000) 
   {
      $post_block = 50;
      //Geef waardes aan de variables die bepalen in welk groepje 
      //een waarde valt
      if(!isset ($post_lowest) && !isset($post_highest))
        { 
        $post_lowest = 0;
        $post_highest = $post_block;
        }
      // Kijk of waarde in het groepje hoort, zo ja count+1
      if($post_value < $post_highest && $post_value >= $post_lowest)
        {
        $member['POST_COUNT'] = $member['POST_COUNT']+1;
        }
      //Niet bij dat groepje, dan output geven en de waardes 
      //van r_highest/lowest verhogen met 50
      else 
        {
       $member['POST_RANGE'] = "$post_lowest " . "-" . " $post_highest";
                      
        echo "$member[POST_RANGE] $member[POST_COUNT] |";
        $post_lowest = $post_highest;
        $post_highest = $post_highest + $post_block;

        // ZEt count weer op 0       
        $member['POST_COUNT'] = 0;
         // Kijken of hij na verhoging van 50 wel meegeteld wordt, zo ja count+1
         if($post_value < $post_highest && $post_value >= $post_lowest)
          {
            $member['POST_COUNT'] = $member['POST_COUNT']+1;
          }
                   
        }    
     
   }
}
?>


Dit is een stukje uit de code, de array die je hierboven ziet, is een denkbeeldig stukje van het aantal posts van de users. Het werkt allemaal perfect als er nooit meer dan 50 posts verschil zit tussen opeenvolgende users. Maar dit hoeft natuurlijk helemaal niet. Kijk maar naar het einde van de array je ziet dat het aantal users opeens >100 meer is. De output die dit script geeft is:

0 - 50 2 |50 - 100 1 |100 - 150 1 |150 - 200 0 |

Dit klopt natuurlijk helemaal niet, hij heeft de laatste 2 waardes weggelaten. Wat doe ik hier fout? Pak ik dit probleem wel goed aan, of is mijn manier veeeel te omslachtig?

  • Grum
  • Registratie: Juni 2001
  • Niet online
Veelste omslachtig :)

Ga eens kijken wat je met count, /, group by, floor in mysql kan :)

count(...), floor( val / 50 ) .. group by ....

Should be do-able :D

  • Quibus
  • Registratie: November 2000
  • Laatst online: 12:26
Dankje, ik ga men arrays eens wegmieteren en kijken of het hier ook mee te doen is. Is dit nog steeds te doen (met MySQL) als je bijvoorbeeld 200 rijen of meer terug moet geven

Verwijderd

Zolang je maar...

code:
1
SELECT COUNT(id) FROM ...


doet en niet...

code:
1
SELECT COUNT(*) FROM ...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05:00
(jarig!)
Verwijderd schreef op 06 november 2002 @ 16:41:
Zolang je maar...
code:
1
SELECT COUNT(id) FROM ...
doet en niet...
code:
1
SELECT COUNT(*) FROM ...
Want???

  • Quibus
  • Registratie: November 2000
  • Laatst online: 12:26
Hoe moet ik die SQL querry precies maken? Ik heb wat geprobeert maar dat klopt allemaal niet.
code:
1
2
SELECT COUNT(id) AS posts, FLOOR(posts/50) AS member_numbers 
FROM `members` GROUP BY member_numbers


Dat werkt natuurlijk niet, kan iemand me nog een hing geven :D ?

* Quibus meot eens een goede SQL tutorial gaan lezen

  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

Weleens van optimalistie gehoord 8)7

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • Sjeik
  • Registratie: Augustus 2001
  • Laatst online: 23-08 20:47
Dan gaat ie maar een keer het aantal id's tellen en niet alle rijen in je tabel een keer :) (Dus en id en naam en blablabla...)

Was ik maar rijk en niet zo knap...


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Sjeik schreef op 06 november 2002 @ 22:10:
Dan gaat ie maar een keer het aantal id's tellen en niet alle rijen in je tabel een keer :) (Dus en id en naam en blablabla...)
Hoeft niet altijd sneller te zijn, zie:
http://www.mysql.com/doc/en/Group_by_functions.html
COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether they contain NULL values. COUNT(*) is optimised to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:
mysql> SELECT COUNT(*) FROM student;

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Quibus schreef op 06 november 2002 @ 17:04:
Dat werkt natuurlijk niet, kan iemand me nog een hing geven :D ?
probeer dit eens:
code:
1
2
3
4
5
SELECT COUNT(*) AS posts,
       FLOOR(posts/50) AS member_numbers 
FROM `members` 
GROUP BY 2
ORDER BY 1 ASC

Today's subliminal thought is:

Pagina: 1