Newsgroup: it.comp.software.database
Titolo: Problema con raggruppamenti [LUNGO]

Innanzitutto buongiorno a tutti :) visto che sono nuovo del NG ;)
Premesso che sinceramente non so come uscirne se non ridondare i dati.
Allora io ho questa struttura tabellare:
Tabella PRINCIPALE:
id -> chiave univoca
content -> contenuto
Tabella TAGS
id -> chiave univoca
nome -> nome del tag
Tabella REL_PRINCIPALE_TAGS
id_pri -> id tabella principale
id_tag -> id tabella tags
Uso mysql 5.1 e dovrei tirar fuori per ogni record della tabella
principale i tags ad esso associati. Fin qui tutto normale in quanto
con questa query riesco a tirar fuori ciò che cerco senza problemi
[query]
SELECT
  GROUP_CONCAT(DISTINCT tags.nome ORDER BY tags.nome ASC SEPARATOR ',
') as tags_trovati,
  principale.*
FROM
  principale
  LEFT JOIN rel_principale_tags ON 
principale.id
 =
rel_principale_tags.id_pri
  LEFT JOIN tags ON 
tags.id
 = rel_principale_tags.id_tag
WHERE
 
principale.id
 = 1
GROUP BY
 
principale.id
;
[/query]
Quindi se per il record 1 ho una serie di tags associati lui mi tira
fuori logicamente i tags separati da una (,) virgola e quindi ad
esempio tag1, tag2, tag3, tag4, tag5 in quanto il record 1 ha 5 tag
associati.
Ora se io voglio una ricerca solo per quelli che hanno il tag1 o il
tag2 cambio la query in questo modo:
[query]
SELECT
  GROUP_CONCAT(DISTINCT tags.nome ORDER BY tags.nome ASC SEPARATOR ',
') as tags_trovati,
  principale.*
FROM
  principale
  LEFT JOIN rel_principale_tags ON 
principale.id
 =
rel_principale_tags.id_pri
  LEFT JOIN tags ON 
tags.id
 = rel_principale_tags.id_tag
WHERE
 
principale.id
 = 1
  AND tags.nome IN ('tag1','tag2')
GROUP BY
 
principale.id
;
[/query]
e fin qui ancora nessun problema nel funzionamento della query in
quanto lui mi tira fuori ciò di cui ho bisogno l'unico problema l'ho
quando vado a stampare il campo tags_trovati in quanto non mi stampa
più tutti i tags associati ad un record ma solo i tags che
corrispondono a quelli ricercati.
Ecco il mio quesito, come posso ovviare (senza creare un campo nella
tabella principale che mi tenga traccia dei tags associati) ad
impostare i criteri di ricerca e nello stesso tempo per ogni record
farmi stampare anche tutti i tags ad esso associati ... ?
Logicamente il tutto in una sola query (se è possibile) :)
io ora ho risolto ridondando il campo tags nella tabella principale
cosi facendo la ricerca la faccio sugli indici della tabella associata
e visualizzo il campo tags della tabella principale ma cosi facendo
(correggetemi se sbaglio) mi sembra un inutile sperpero di risorse in
quanto la tabella principale conterrà molti record con tantissimi tags
duplicati.
Grazie a tutti :)
--
[CapoBecchino]
msn: capobecchino |[@]| hotmail |[.]| com
SEZIONE PICCOLI ACCORGIMENTI: "Chiamami un tassì", mi disse prima di
morire e sulla sua lapide ho scritto: "Qui riposa in pace Untassì"

... cut ...
Signori ho risolto ed ecco la soluzione cosi se può servire ad
altri ;)
[query]
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('|',tags.nome,'|') ORDER BY tags.nome
ASC SEPARATOR ',') as tags_trovati,
  principale.*
FROM
  principale
  LEFT JOIN rel_principale_tags ON 
principale.id
 =
rel_principale_tags.id_pri
  LEFT JOIN tags ON 
tags.id
 = rel_principale_tags.id_tag
WHERE
 
principale.id
 = 1
GROUP BY
 
principale.id
HAVING
  tags_trovati LIKE '%|tag_1|%' AND tags_trovati LIKE '%|tag_2|%'
;
[/query]
Grazie a tutti ;)
--
[CapoBecchino]
msn: capobecchino |[@]| hotmail |[.]| com
SEZIONE DIVERTIMENTO & AFFINI: Il capo all'impiegato: "E' già la
quinta volta che arriva tardi questa settimana. Che cosa devo
pensare?" - "Che è venerdì!"