Newsgroup: it.comp.www.php
Titolo: [OT mysql] Selezionare n record, ma non di più di m per tipo

Come al solito sono OT, ma visto che frequento solo questo newsgroup peggio
per voi =)
Scherzi a parte, magari č utile a qualcuno scoprirlo come lo sarebbe per me:
Ho n record di una tabella con due campi, A e B. Come faccio a selezionare i
primi N risultati di una query relativa al campo B ma (arriva il bello) non
mostrando piů di M risultati che concordino su A?
Esempio:
A    B (colonne)
a    e
a    i
a    o
a    u
1    2
1    3
1    4
1    5
Dovrei mostrare i primi 10 (o meno, come in questo caso) ma non piů di 3 per
tipo (A)
Il risultato dovrebbe essere
A    B (colonne)
a    e <- prima di tipo a
a    i <- seconda di tipo a
a    o <- terza di tipo a
1    2 <- prima di tipo 1
1    3 <- seconda di tipo 1
1    4 <- terza di tipo 1
Pensavo ad aggiungere un campo che faccia da conteggio, e su cui poi avrei
messo delle condizioni... ma non so se e come si puň fare. L'ideale sarebbe
usare una bella UNION, ma su mysql V.quella.che.ho non č disponibile.
Mi serve perchč ho un elenco di news di varie fonti che vorrei mostrare in
modo abbastanza omogeneo, mostrando max 3 news per fonte.
Inizialmente volevo fare in modo che le news fossero in ordine di
aggiornamento, ma una delle fonti aggiorna molto di piů delle altre,
portandole sempre fuori dai primi 15 posti (maledetta BBC).
Thanks
Ludovico

Ludovico Grossi wrote:
| Come al solito sono OT, ma visto che frequento solo questo newsgroup
[...cut...]
| portandole sempre fuori dai primi 15 posti (maledetta BBC).
|
| Ludovico
Forse basterebbe una ripassata alle SQL (magari servirebbe anche a
me:-))
Credo di ricordare che puoi mettere delle condizioni di group-ing cosě:
Testo-della-select
GROUP BY A
    HAVING COUNT(tabella.A) <= 4 AND COUNT(tabella.B) <=10
"dovrebbe" tirarti fuori i dati come da te richiesto. Ciao
-- 
..::[ Panz ]::..
-----------------------
per rispondere riscrivi in numeri la mia eMail!

     HAVING COUNT(tabella.A) <= 4 AND COUNT(tabella.B) <=10
Non sembra funzionare: piů tardi me la riguardo meglio e do una ripassata
Cmq grazie!
Ludovico

 me:-))
Eh, già, una bella ripassata ad entrambi non guasterebbe...
SELECT *, count(A)
FROM tabella  GROUP BY A
HAVING COUNT(A) > 2
questa query, per esempio, mostra una news per fonte (perchè il risultato di
COUNT(A) è sempre maggiore di due)
Al contrario, mettendo
HAVING COUNT(A) <=3
non restituisce nessun risultato.
Se non sbaglio si usa HAVING allo stesso modo in cui si usano le espressioni
nel WHERE, ma su campi aggregati (dati dal GROUP BY). Tuttavia, una volta
che i record sono raggruppati per il campo A, i dati che voglio estrarre
sono andati *persi*.
Ludovico

Ludovico Grossi wrote:
| SELECT *, count(A)
| FROM tabella  GROUP BY A
| HAVING COUNT(A) > 2
Dovresti aggiungere anche il raggruppamento per B, ma in ogni caso non
ottieni quello che chiedevi: se non ho capito male quello che devi
estrarre sono le prime 3 per ogni colonna A e i relativi campi per B
giusto?
Credo di averti dato la soluzione sbagliata ... mi sa che ho segato!
sorry! :-(
Mi viene in mente che potresti fare la query separate per ogni colonna A
e mettere il LIMIT (di mySQL) al numero di record che vuoi ottenere in
uscita. Però dovresti farlo in un ciclo per ogni "distinct" elemento
della colonna A (e che abbia almeno 3 corrispondenze nella colonna B)
| questa query, per esempio, mostra una news per fonte (perchè il
[...cut...]
| dati che voglio estrarre sono andati *persi*.
Scusa per la dritta errata! :-(
sorry!
