Newsgroup: it.comp.www.php
Titolo: la query della Susi

Concettualmente banale, ma non ne salto fuori.
Ho una tabella di questo tipo:
idoperazione, idserata, codicescheda, dataora, operazione
e altri attributi che ometto.
Operazione e' un ENUM di questo tipo:
enum('entrata', 'sospesa', 'riattivata', 'uscita', 'consumazione')
Il programma gestisce entrate, uscite e consumazioni di un locale.
A chiusura serata voglio trovare le schede scomparse, cioe' quelle mai
uscite.
Vorrei quindi trovare, per ogni scheda di una determinata serata,
l'ultima operazione fatta che non sia 'consumazione'.
Il guaio e' che non trovo una query che funzioni; per esempio, questa:
SELECT idoperazione,codicescheda, MAX(dataora) FROM operazioni WHERE
idserata=7 AND operazione<>'consumazione' GROUP BY codicescheda;
mi restituisce le *prime* operazioni fatte, e non le ultime...
hola
Buttha

 [snip]
Aggiornamento:
SELECT MAX(idoperazione) FROM operazioni WHERE idserata=7 AND
operazione<>'consumazione' GROUP BY codicescheda;
mi restituisce gli idcorretti ma se la estendo cosi':
SELECT MAX(idoperazione), operazione, codicescheda FROM operazioni
WHERE idserata=7 AND operazione<>'consumazione' GROUP BY codicescheda;
gli idoperazione sono ancora corretti ma operazione non corrisponde
con l'idoperazione restituito.
Esempio:
mysql> SELECT MAX(idoperazione) FROM operazioni WHERE idserata=7 AND
operazione<>'consumazione' GROUP BY codicescheda;
+-------------------+
| MAX(idoperazione) |
+-------------------+
|                 1 |
|                 3 |
|                 7 |
+-------------------+
3 rows in set (0.00 sec)
mysql> SELECT MAX(idoperazione) as massimo, operazione, codicescheda
FROM operazioni WHERE idserata=7 AND operazione<>'consumazione' GROUP
BY codicescheda;
+---------+------------+--------------+
| massimo | operazione | codicescheda |
+---------+------------+--------------+
|       1 | entrata    | 12           |
|       3 | entrata    | 13           |
|       7 | entrata    | 14           |
+---------+------------+--------------+
3 rows in set (0.00 sec)
mentre in realta':
idoperazione=1 operazione=entrata
idoperazione=3 operazione=uscita
idoperazione=7 operazione=sospesa
hola
Buttha

 [snip]
Vabbuo', faro' questo:
$result=mysql_query("BEGIN",$assistenza) or die(mysql_error());
$result=mysql_query("
SELECT codicescheda, MAX(idoperazione) AS massimo FROM operazioni 
WHERE idserata=$HTTP_GET_VARS[idserata] AND operazione<>'consumazione'
GROUP BY codicescheda",$assistenza) or die(mysql_error());
$quantenonuscite=$quantenonrientrate=0;
while ($res=mysql_fetch_object($result)):
	$res1=mysql_query("SELECT operazione FROM operazioni WHERE
idoperazione=$res->massimo",$assistenza) or die(mysql_error());
	$res1=mysql_fetch_object($res1);
	if ($res1->operazione=="entrata" ||
$res1->operazione=="riattivata"  )  $quantenonuscite+=1; 
	elseif ($res1->operazione=="sospesa")  $quantenonrientrate+=1;
endwhile;
$result=mysql_query("COMMIT",$assistenza) or die(mysql_error());
hola
Buttha

 con l'idoperazione restituito.
è un errore concettuale.
selezionare
max(idoperazione)
è diverso da selezionare 
idoperazione where idoperazione=max(idoperazione).
tu selezioni il MAX, ma questo non corrisponde per forza ad un record solo 
(in realtà si perché è una chiave, ma non a livello di "tipo di query", 
quindi il goup by viola l'integrità dei dati)
soluzione:
"select MAX(idoperazione) FROM operazioni WHERE idserata=7 AND
operazione<>'consumazione'"; //tolto il group by!!
(ritorna 1 record)
fetch in una var $eccolo
"select campi from operazioni where idoperazione='$eccolo'";
oppure, dove il dbms lo permette:
SELECT idoperazione, operazione, codicescheda FROM operazioni
where idoperazione=(select max(idoperazione) from operazioni
WHERE idserata=7 AND operazione<>'consumazione');
fai sapere se c'ho preso.
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.php.net

fai sapere se c'ho preso.
Come avrai visto dal post sopra, e' la soluzione che ho adottato. Mi
sarebbe piaciuto, pero', risolvere il tutto con una query. In realta,
visto che poi devo distinguere i vari casi, forse e' l'unica soluzione
possibile.
hola
Buttha