Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    query con GROUP_CONCAT()

    Dò una mano a tutti... ma stavolta serve una mano a me.

    Ho questa query che funziona perfettamente:
    codice:
    SELECT 
    	capitoli.titolo 
    		AS titolo, 
    	articoli.sub_titolo 
    		AS subtitolo, 
    	GROUP_CONCAT(DISTINCT argomenti.argomento SEPARATOR '|') 
    		AS argomenti,
    	COUNT(DISTINCT commenti.id_commento) 
    		AS numero_commenti,
    	utenti.nome 
    		AS autore
    FROM 
    	articoli 
    LEFT OUTER JOIN 
    	argomenti_articolo ON (articoli.id_articolo = argomenti_articolo.id_articolo) 
    LEFT OUTER JOIN 
    	argomenti ON (argomenti.id_argomento = argomenti_articolo.id_argomento)
    INNER JOIN 
    	utenti ON (utenti.id_user=articoli.id_utente) 
    INNER JOIN 
    	capitoli ON (capitoli.id_capitolo=articoli.id_capitolo)
    LEFT OUTER JOIN
    	commenti ON (commenti.id_articolo = articoli.id_articolo)
    Il mio problema è che con GROUP_CONCAT estraggo una stringa con il nome degli argomenti separati gli uni dagli altri da un carattere separatore (fin qui ok)...
    Tuttavia a me interesserebbe estrarre anche gli 'argomento.id_argomento' per ciascuno di quelli individuato con il GROUP_CONCAT solo che in ogni tentativo che faccio tramite phpmyadmin la query lanciata viene eseguita correttamente ma al posto degli id "concatenati" mi estrae una cosa di questo genere:

    [BLOB - 3B]

    cosa significa?
    come risolvo?

  2. #2
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    765
    perchè probabilmente concat funziona solo con campi dello stesso tipo (quindi presumo che argomenti.id_argomento sia INT, mentre l'altro campo che concateni sia VARCHAR o qualcos'altro)

    prova a sostituire nel concat

    argomenti.id_argomento

    con

    CAST(argomenti.id_argomento AS CHAR(10000) CHARACTER SET utf8)
    eXvision

  3. #3
    Originariamente inviato da brodik
    perchè probabilmente concat funziona solo con campi dello stesso tipo (quindi presumo che argomenti.id_argomento sia INT, mentre l'altro campo che concateni sia VARCHAR o qualcos'altro)

    prova a sostituire nel concat

    argomenti.id_argomento

    con

    CAST(argomenti.id_argomento AS CHAR(10000) CHARACTER SET utf8)
    WOW.... FUNZIONA... è la query più complessa che mi sia mai sognato di fare.
    La posto nella sua completezza:
    codice:
    SELECT 
    	capitoli.titolo 
    		AS titolo, 
    	articoli.sub_titolo 
    		AS subtitolo, 
    	articoli.meta_desc
    		AS metadescription,
    	articoli.meta_key
    		AS metakeywords,
    	articoli.testo 
    		AS testo,
    	DATE_FORMAT(articoli.data_inserimento, '%d %M %Y ore %H:%i') 
    		AS data_up,
    	GROUP_CONCAT(DISTINCT argomenti.argomento ORDER BY argomenti.id_argomento SEPARATOR '|') 
    		AS argomenti,
    	GROUP_CONCAT(DISTINCT CAST(argomenti.id_argomento AS CHAR(10000) CHARACTER SET utf8) ORDER BY argomenti.id_argomento SEPARATOR '|')
    		AS id_argom,
    	COUNT(DISTINCT commenti.id_commento) 
    		AS numero_commenti,
    	utenti.nome 
    		AS autore
    FROM 
    	articoli 
    JOIN 
    	argomenti_articolo ON (articoli.id_articolo = argomenti_articolo.id_articolo) 
    JOIN 
    	argomenti ON (argomenti.id_argomento = argomenti_articolo.id_argomento)
    INNER JOIN 
    	utenti ON (utenti.id_user=articoli.id_utente) 
    INNER JOIN 
    	capitoli ON (capitoli.id_capitolo=articoli.id_capitolo)
    LEFT OUTER JOIN
    	commenti ON (commenti.id_articolo = articoli.id_articolo)
    ORDER BY data_up DESC

  4. #4
    ... avevo gridato vittoria troppo presto
    la query sopra non sò il perchè ma mi estrae sempre e solo un unico record.

    Riporto questi dati sperando di trovare un'anima pia che mi dia una mano
    ... sono giorni che sto smanettando con una query e sto impazzendo con le join.
    Ho un db così strutturato:
    codice:
    CREATE TABLE IF NOT EXISTS `articoli` (
      `id_articolo` int(11) NOT NULL AUTO_INCREMENT,
      `id_capitolo` int(11) NOT NULL,
      `id_utente` int(11) NOT NULL,
      `sub_titolo` varchar(255) NOT NULL,
      `testo` text NOT NULL,
      PRIMARY KEY (`id_articolo`)
    )
    
    CREATE TABLE IF NOT EXISTS `capitoli` (
      `id_capitolo` int(11) NOT NULL AUTO_INCREMENT,
      `titolo` varchar(255) NOT NULL,
      PRIMARY KEY (`id_capitolo`)
    )
    
    CREATE TABLE IF NOT EXISTS `argomenti_articolo` (
      `id_rel_arg` int(11) NOT NULL AUTO_INCREMENT,
      `id_argomento` int(11) NOT NULL,
      `id_articolo` int(11) NOT NULL,
      PRIMARY KEY (`id_rel_arg`)
    )
    
    CREATE TABLE IF NOT EXISTS `argomenti` (
      `id_argomento` int(11) NOT NULL AUTO_INCREMENT,
      `argomento` varchar(40) NOT NULL DEFAULT 'altro',
      PRIMARY KEY (`id_argomento`)
    )
    
    
    CREATE TABLE IF NOT EXISTS `utenti` (
      `id_user` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(60) NOT NULL,
      PRIMARY KEY (`id_user`)
    )
    
    
    
    CREATE TABLE IF NOT EXISTS `commenti` (
      `id_commento` int(11) NOT NULL AUTO_INCREMENT,
      `id_articolo` int(11) NOT NULL,
      PRIMARY KEY (`id_commento`)
    )
    Le relazioni:
    articoli-capitoli è molti a 1 (ogni articolo è associato ad uno specifico capitolo)
    articoli-argomenti è molti a molti (ogni articolo può avere diversi argomenti)
    articoli-commenti è 1 a molti (ogni articolo può avere più commenti)
    articoli-utenti è molti a 1 (ogni articolo ha uno specifico utente/autore)

    Io devo estrarre per ogni articolo:
    - il nome del capitolo associato
    - l'autore (NB: è unico)
    - il numero di commenti
    - la lista degli argomenti e i relativi id: essendo una relazione molti a molti quindi viene fuori GROUP_CONCAT()...

    Per i primi 3 punti ho risolto così
    codice:
    SELECT DISTINCT
    	capitoli.titolo 
    		AS capitolo, 
    	articoli.sub_titolo 
    		AS subtitolo, 
    	articoli.testo 
    		AS testo,
    	utenti.nome 
    		AS autore,
    	(SELECT COUNT(commenti.id_commento) FROM commenti WHERE commenti.id_articolo=articoli.id_articolo) 
    		AS numero_commenti
    FROM 
    	articoli
    INNER JOIN 
    	utenti ON (utenti.id_user=articoli.id_utente) 
    INNER JOIN 
    	capitoli
    	  ON (capitoli.id_capitolo=articoli.id_capitolo)
    LEFT OUTER JOIN
    	commenti ON (commenti.id_articolo=articoli.id_articolo)
    Ora come posso estrarre anche gli id_argomento e argomento?
    Essendo una relazione molti a molti devo concatenare il tutto in una stringa con GROUP_CONCAT() ma nn ci riesco in nessun modo.

    Voglio evitare di fare 2 query...

  5. #5
    uppino... eddai...

  6. #6
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao oly,
    per quanto sia bello trovare tutti i dati che servono con una sola query, c'è un inconveniente, quando le tue tabelle conterranno migliaia di dati la query diventerà molto pesante.

    Forse sarebbe il caso di effettuare più query..

    Ciao

  7. #7
    io nn l'ho messo nella query di esempio... ma questa query prevederà un
    LIMIT 5

    ... daiiiiiii nn ci credo che nessuno ci riesce...

  8. #8
    come al solito mi devo arrangiare da solo...
    cmq: quando si usa GROUP_CONCAT occorre utilizzare la clausola GROUP (devo studiare sta cosa!!)... in pratica la query del mio secondo post andava benissimo ma era priva del GROUP BY
    ...
    oppure il WHERE...
    codice:
    SELECT 
    	capitoli.titolo 
    		AS titolo, 
    	articoli.id_articolo
    		AS id,
    	articoli.sub_titolo 
    		AS subtitolo, 
    	articoli.meta_desc
    		AS metadescription,
    	articoli.meta_key
    		AS metakeywords,
    	articoli.testo 
    		AS testo,
    	DATE_FORMAT(articoli.data_inserimento, '%d %M %Y ore %H:%i') 
    		AS data_up,
    	GROUP_CONCAT(DISTINCT argomenti.argomento ORDER BY argomenti.id_argomento SEPARATOR '|') 
    		AS argomenti,
    	GROUP_CONCAT(DISTINCT CAST(argomenti.id_argomento AS CHAR(10000) CHARACTER SET utf8) ORDER BY argomenti.id_argomento SEPARATOR '|')
    		AS id_argom,
    	COUNT(DISTINCT commenti.id_commento) 
    		AS numero_commenti,
    	utenti.nome 
    		AS autore
    FROM 
    	articoli 
    JOIN 
    	argomenti_articolo ON (articoli.id_articolo = argomenti_articolo.id_articolo) 
    JOIN 
    	argomenti ON (argomenti.id_argomento = argomenti_articolo.id_argomento)
    INNER JOIN 
    	utenti ON (utenti.id_user=articoli.id_utente) 
    INNER JOIN 
    	capitoli ON (capitoli.id_capitolo=articoli.id_capitolo)
    LEFT OUTER JOIN
    	commenti ON (commenti.id_articolo = articoli.id_articolo)
    GROUP BY id
    ORDER BY data_up DESC

  9. #9
    Chiedo consiglio agli esperti di mysql.

    Ma se creassi una wiev?
    Siccome non mi è mai capitato di usarle ma ho solo letto qualcosa qui e là...
    per un uso di questo tipo è adatto?
    avete consigli da darmi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.