Newsgroup: it.comp.www.php
Titolo: Range di numeri

Premessa: ho provato a postare su free.it.comp.database.mysql ma non ho 
avuto risposta. Provo quì, magari sarò più fortunato.
------------------------------------------------------------------------
Ciao a tutti.
Ho un db strutturato più o meno così:
|-----------|--------|
| timestamp | valore |
|-----------|--------|
|1111111111 | AAAAAA |
|2222222222 | AAAAAA |
|3333333333 | AAAAAA |
|4444444444 | BBBBBB |
|5555555555 | BBBBBB |
|6666666666 | AAAAAA |
|7777777777 | AAAAAA |
|
8888888888
 | BBBBBB |
|9999999999 | CCCCCC |
|-----------|--------|
Ovviamente i timestamp sono variabili come anche i valori.
Ho la necessità di ottenere un range contiguo, con gli estremi di ogni 
valore, qualcosa di sto tipo:
AAAAAA - 1111111111 -> 3333333333
BBBBBB - 4444444444 -> 5555555555
AAAAAA - 6666666666 -> 7777777777
BBBBBB - 
8888888888
 -> 
8888888888
CCCCCC - 9999999999 -> 9999999999
Preferirei fare tutto a livello di MySQL in modo da poter anche ordinare 
per valore mostrando prima tutti i range di AAAAAA poi BBBBBBB e così via.
Non saprei da dove cominciare. Con il "GROUP BY range" riesco ad 
ottenere il MIN e MAX, ma complessivo e non di soli quelli contigui.
Nell'esempio di cui sopra, usando "GROUP BY range" riesco ad ottenere
AAAAAA 111111111 -> 7777777777
BBBBBB 444444444 -> 
8888888888
CCCCCC 999999999 -> 9999999999
e non va bene.
Sapete darmi una mano?
Tnx.

 valore mostrando prima tutti i range di AAAAAA poi BBBBBBB e così via.
Penso che in mySQL, l'esatta cosa che vuoi fare tu, usando solo i due 
campi timpestamp e valore, non puoi farla. Come tu stesso hai notato se 
utilizzi un GROUP BY, ti vengono presi TUTTI i valori, non solo quelli 
contigui (ome è giusto che sia, in una situazione "normale" :) ).
Utilizzando invece PHP, ti carichi tutta le righe della tabella, le 
scorri una a una memorizzando il valore precedente, nel caso il valore 
attuale è uguale al valore precedente, lo includi nel range e prosegui, 
viceversa, termini il range precedente, e prosegui aprendo un nuovo 
range, relativo al nuovo valore.
Il tutto è abbastanza semplice, poche righe di codice in tutto.
-- 
rob4you

 Il tutto è abbastanza semplice, poche righe di codice in tutto.
Ho provato a farlo prima di chiedere la soluzione mysql-based ma ho 
avuto difficolta. Eppure è una procedura che ho già effettuato più volte 
in maniera analoga.
Hai qualche riga di codice che mi possa dare una mano?
Non so perchè, ma nel mio caso in particolare (l'esempio quì riportato è 
stato leggermente semplificato) ho difficoltà ad ottenere i range.

 Hai qualche riga di codice che mi possa dare una mano?
Of course I have. LOL
Ecco tutto il codice. L'unica cosa che non ho messo, è la creazione di 
una tabella chiamata "tabella" (che originalità), avente due campi, uno 
chiamato "timestamp" (BIGINT) e uno chiamato "valore" (VARCHAR).
Ecco le operazioni che faccio (ma a te interessa solo l'ultima:
- svuoto la tabella "tabella"
- riempio la tabella "tabella" con i valori che tu hai usato come 
esempio
- a partire dal contenuto della tabella "tabella", creo un array $ar 
che produce l'effetto che chiedevi tu.
Ecco il codice:
<pre>
<?php
require_once './../db_connection.php';
db_connection();
$sql_truncate = "TRUNCATE TABLE tabella";
$result_truncate = mysql_query($sql_truncate);
if(!$result_truncate) die("Error: ".mysql_error());
$sql_insert = "INSERT INTO tabella (timestamp,valore) VALUES
					(1111111111,'AAAAAA'),
					(2222222222,'AAAAAA'),
					(3333333333,'AAAAAA'),
					(4444444444,'BBBBBB'),
					(5555555555,'BBBBBB'),
					(6666666666,'AAAAAA'),
					(7777777777,'AAAAAA'),
 
(8888888888
,'BBBBBB'),
					(9999999999,'CCCCCC')";
$result_insert = mysql_query($sql_insert);
if(!$result_insert) die("Error: ".mysql_error());
$sql_select = "SELECT timestamp,valore FROM tabella";
$result_select = mysql_query($sql_select);
if(!$result_select) die("Error: ".mysql_error());
$ar = array();
$valore_prec = '';
$max = -1;
$stringa = '';
$i = 0;
while ($row = mysql_fetch_assoc($result_select)) {
	if($row['valore'] != $valore_prec) {
		if($i++) {
			$stringa .= $max;
			$ar[] = $stringa;
		}
		$stringa = $row['valore'] ." - ". $row['timestamp'] ." -> ";
	}
	$valore_prec = $row['valore'];
	$max = $row['timestamp'];
}
$ar[] = $stringa.$max;
print_r($ar);
?>
</pre>
-- 
rob4you
www.outofmind.eu

 Of course I have. LOL
Grazie!!