Divisione di una query e resto della divisione

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Buongiorno a tutti e Buone feste passate e future a tutti gli utenti,

scrivo epr un piccolo quesito che forse tanto piccolo non è

dovrei dividere il risultato di una query in fasce dove però sia il numero di face che il numero del count mi sono ignoti ma sono sotto forma di variabili.

Senza tanti giri di parole ho questo codice

PHP:
$dati_totali=array();
$sql = ("SELECT * FROM tabella ORDER BY nome");  
$result = mysql_query($sql) or die("Query fallita1: " . mysql_error() );
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
$nome=$row['nome'];	
$punti=$row['punti'];
$dati_totali[]= array('nome'=>$nome,'pt'=>$punti);

}
$array= array_msort($dati_totali, array('pt'=>SORT_DESC));

in questa maniera ho un array con tutti i nomi e tutti i punti per ogni nome, ordinate per punti

con count($array) risalgo al numero dei nomi presenti ad esempio 21, poi da un'altra query mi arriva il numero epr cui devo dividere le fasce ad esempio 7 in funzine dei punti

quindi ho 24 nomi e 7 fasce come faccio?

in pratica devo fare 24/7 dove mi deve assegnare la

- fascia 1 ai primi 3
- fascia 2 dal 4 al 6
- fascia 3 dal 7 al 9
- fascia 4 dal 10 al 12
- fascia 5 dal 13 al 15
- fascia 6 dal 16 al 18
- fascia 7 dal 19 all'ultimo

diciamo che forse forse sapreia nche come dividere epr 3 etc. però resto al palo con ciò che avanza dalla divisione

suggerimenti?
 
Ultima modifica di un moderatore:
sostituisci
$sql = ("SELECT * FROM tabella ORDER BY punti DESC");
inutile ordinare per nome se ti serve un ordinamento diverso

ho già poche idee di mio ma, ogni tanto mi vengono anche ben confuse ...

provo a capire, vuoi dividere le persone in fasce da 'N' (es. 3) in funzione dei punti
ora se hai un numero di persone superiore a 'N' che ha punteggio uguale come le vuoi dividere ?

la query che segue (MS SQL) restituisce due contatori uno ascendente ed uno discendente
in funzione dei punti
SELECT nome
, punti
, ROW_NUMBER() OVER (ORDER BY punti ASC) AS nr_asc
, ROW_NUMBER() OVER (ORDER BY punti DESC) AS nr_desc
FROM tabella
order by punti DESC
all'interno di questa si può derivare la fascia ma,

magari con qualche informazione più chiara su cosa vuoi fare ti si può aiutare meglio
ciao
Marino
 
Si bè effettivamente mi bastava ordinare per i punti, a volte le cose semplici sono sotto gli occhi. cmq aldilà di questo ho modificato il codice creando un array avente i nomi come indici e i punti come valore

detto ciò

io ho un numero di tot fasce che mi deriva da un altra query ipotizziamo 7

ora le fasce devono essere sempre 7 aldilà del numero totale dei nomi e fin qua ci sono arrivato su divisioni a numero intero usando array_chunk

PHP:
$fas=$count($nomi/7);
foreach($punti as $keyA=>$pt){
$new[]=$keyA; //creo un multi array
}

$new_array=array_chunk($new, $fas);///


for($x=0;$x<=7;$x++){
	foreach($new_array[$x] as $NOMI){
	$nx=$x+1;//la nuova chiave incomincia da 0 perchè ho usato 
	echo "<pre>";
	echo $sq."-".$nx;
	echo "</pre>";
	}
}

cosi ottengo i nomi ordinati per punteggio in gruppi da 4 per 7 fasce.

Il problema nasce sui numeri non divisibili dove ad esempio invece di 28 nomi ne ho 29

quindi mi deve creare 6 fasce da 4 nomi e 1 fascia da 5 nomi

e viceversa se ho 26 nomi mi deve creare 6 fasce da 4 nomi e 1 fascia da 2 nomi

se ho 22 nomi deve crearmi la prima fascia da 4 e le successive 6 da 3.
 
dato il numero dei gruppi da creare : Ngruppo

contiamo le righe totali da raggruppare : Rtot

calcoliamo il numero massimo di righe x gruppo : Rmax = ARROTONDA(Rtot/Ngruppo+0,4999999;0) (ovviamente intero)

ciascuna riga della tabella ha un indice progressivo : Iprog, da 1 a Rtot

il gruppo di appartenenza è calcolato con : Gruppo = 1+INT((Iprog-1)/Rmax)

ti posto il risultato excel con esempi di Ngruppo da 2 a 10

spero che qualche mente più giovane trovi una soluzione più ... carina

ciao
marino
Cattura.PNG
 

Discussioni simili