Newsgroup: it.comp.programmare
Titolo: php e postgres

Ciao a tutti,
sto provando a fare una query su un Postgresql ma non mi riesce di
farla funzionare...php mi restituisce sempre errore:
query:
SELECT rubrica, titolo, abstract FROM notizie WHERE
categoria='Speciali' AND stato='Pubblicato' GROUP BY rubrica ORDER BY
data LIMIT 10
Warning: PostgreSQL query failed: ERROR: Attribute notizie.titolo must
be GROUPed or used in an aggregate function 
la sintassi Sql mi sembra corretta........sto un po' impazzendoci
sopra..
Qualcuno mi puo' aiutare? Grazie!!
Ciao,
Leonardo

 la sintassi Sql mi sembra corretta........sto un po' impazzendoci
la risposta al problema sta nel warning che ti restituisce postgres:
SELECT rubrica, titolo, abstract
FROM notizie
WHERE categoria = 'Speciali'
AND stato = 'Pubblicato'
ORDER BY data
LIMIT 10
se usi la clausola GROUP BY devi raggruppare per tutti i campi su cui
non usi funzioni aggregate (AVG(), SUM(), ...) altrimenti la query non
avrebbe senso: che vuol dire raggruppare per rubrica se poi chiedi
titolo e abstract che son diversi dentro il gruppo?
Potevi sistemare pure usando GROUP BY rubrica, titolo, abstract -
ma è analogo a non specificare la clausola ;-)
Se volevi ottenere i risultati ordinati in modo da avere le rubriche uguali
vicine devi mettere rubrica come primo campo in ORDER BY.
Bye
     Wiz


wrote:
Non ho capito. :-(
Il problema e' che e' facilmente esprimibile in lingua naturale, ma
non riesco a farmi capire in Sql. Forse e' meglio che utilizzi la
prima forma. :-)
Io vorrei raggruppare per rubrica, e poi, queste, per data (con la
data piu' recente in alto).
Esempio:
ID      rubrica               data
01      Speciale Guerra       01-01-2001
02      Speciale Guerra       01-01-2001
03      Speciale Euro         03-02-2001
04      Speciale Euro         10-03-2001
Quello che non riesco ad ottenere e':
* Speciale Euro
* Speciale Guerra
Perche' l'ultimo record di Speciale Euro e' piu' recente dell'ultimo
record di Speciale Guerra;
Pensavo che un 
	GROUP BY rubrica (...) ORDER BY data 
bastasse...invece :-/
Grazie infinite.
ciao!
Leonardo


 bastasse...invece :-/
togli il group by e metti ORDER BY rubrica, data DESC
In questo modo ordinerà prima per rubrica, e tra le tuple col valore di
rubrica
uguale eseguirà un ordinamento discendente su data
Bye
     Wiz

questo non è un raggruppamento, ma un ordinamento!
No aspetta: quello sopra e' un esempio di record esistenti. Non quello
che dovrebbe essere l'obiettivo della query. ;)
Grazie
ciao
Leonardo

 * Speciale Guerra
abbozzo di soluzione:
diciamo che la tabella in alto si chiami "Tabella"
SELECT T.rubrica
FROM tabella T
WHERE NOT EXISTS (SELECT *
                  FORM tabella T1
                  WHERE T.rubrica=T1.rubrica
                  AND T1.data>T.data);
note:
1-non so come si fa il controllo fra le date, guarda la documentazione della
tua piattaforma
  infatti questo e' platform-dependant
2-non c'ho voglia di spiegarla, (sempre che funzioni).
  cmq considera T e T1 come due tabelle distinte ma *identiche* come formato
e valori.
  e' un buon esercizio! :-)
3-fammi sapere se funzia, sono curioso (e un po' arrugginito, lo ammetto!)
--
Ciao by Allanon

 record per ogni "rubrica" (che, suppongo, si ottiene con il GROUP BY).
vediamo se ho capito che vuoi stavolta ;-)
SELECT DISTINCT rubrica
FROM ...
ORDER BY data
soddisfa? :)
In ogni modo, non puoi usare GROUP BY se nella SELECT indichi
dei campi per cui non raggruppi e non sono in funzioni aggregate.
Es. questa query è errata:
SELECT a, b
FROM tabella
GROUP BY a
è ambigua: il db non saprebbe quale tra i tanti valori di b che
"appartengono" al gruppo di un 'a' restituire come rappresentante
del gruppo. Cioè, con:
a   b
1  2
1  3
...
dovrebbe restituire 1, 2 o 1, 3? Non può decidere...
Invece è corretto, per esempio:
SELECT a, MAX( b )
...
GROUP BY a
poichè non ha problemi di ambiguità


 3-fammi sapere se funzia, sono curioso (e un po' arrugginito, lo ammetto!)
si, sono arrugginito! :-)
lo dimostra la Query di Simone Tellini, mooooooooolto piu' semplice!
38 di febbre mi giustifica? :-)
--
Ciao by Allanon

  infatti questo e' platform-dependant
Il controllo delle date sembra OK, comunque. Nel senso che se ci fosse
errore, non dovrebbe restituire nessuna riga. Il campo interessato
(data) e' proprio di tipo "date", peraltro.
Grazie!
Leonardo


come ho detto nell'altro post prova ad usare al Query di Simone, mooolto
piu' semplice!
(pero' studiati la mia che non fa male! :-) )
nella mia, per ordinare basta mettere in fondo Order by:
SELECT T.rubrica
FROM tabella T
WHERE NOT EXISTS (SELECT *
                  FORM tabella T1
                  WHERE T.rubrica=T1.rubrica
                  AND T1.data>T.data)
ORDER BY T.data;
--
Ciao by Allanon