Visualizzazione risultati 1 fino 7 di 7

Discussione: group_concat_max_len e privilegi

  1. #1
    Solon non è connesso Neofita
    Data registrazione
    19-07-2009
    Messaggi
    4

    Predefinito group_concat_max_len e privilegi

    Salve a tutti,
    per necessità del sito ho scritto una query che contiene GROUP_CONCAT. In questo modo, concatenando una lunga serie di dati, il numero di elementi supera i 1024 stabiliti di default. Ho quindi provato a scrivere la query "SET GLOBAL group_concat_max_len=4096;" che chiaramente non ha funzionato perché non ho i privilegi adatti.
    Cosa posso fare ?
    Grazie mille

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Potresti considerare l'ipotesi di eseguire una normale JOIN ed elaborare i dati a posteriori, usando PHP.

    Sarebbe però meglio conoscere la query che stai cercando di eseguire...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Solon non è connesso Neofita
    Data registrazione
    19-07-2009
    Messaggi
    4

    Predefinito

    Ecco a te:

    Codice:
    SELECT pagine, GROUP_CONCAT(CONCAT(articoli, '=', sottotitolo) 
    ORDER BY articoli 
    SEPARATOR '^ ') AS articoli 
    FROM pagine 
    JOIN (
             elenchi 
             JOIN articoli 
             USING (id_articoli)
    ) ON (pagine.id_pagine = elenchi.id_pagine) 
    GROUP BY pagine 
    HAVING (
                  pagine = "pubblicazioni 2000"
    );
    Funziona benissimo con il doppio JOIN e tutto il resto, tranne per il fatto che i dati nella tabella "articoli" creata dal GROUP_CONCAT si troncano prima della fine!

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Se ho capito bene la struttura del tuo DB, potresti eseguire questa query:
    Codice:
    SELECT pagine, articoli, sottotitolo
    FROM pagine JOIN (elenchi JOIN articoli USING (id_articoli)) ON pagine.id_pagine = elenchi.id_pagine
    WHERE pagine = 'pubblicazioni 2000'
    ORDER BY pagine, articoli
    Per elaborare il risultato in PHP, la strategia migliore è questa:
    Codice PHP:
    <?php
    $query
    = "..."; // vedi sopra
    $result = mysql_query ($query);

    $data = array ();
    while (
    $line = mysql_fetch_assoc ($result))
    {
    $data[$line['pagine']][] = $line['articoli'] . '=' . $line['sottotitolo'];
    }

    foreach (
    $data as $k => $v)
    {
    $data[$k] = implode ('^ ', $v);
    }
    ?>
    Al termine di questo codice, nell'array $data dovresti avere, per ogni riga, gli stessi risultati che otterresti se la query andasse a buon fine...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Solon non è connesso Neofita
    Data registrazione
    19-07-2009
    Messaggi
    4

    Predefinito

    Funziona tutto! A questo punto devo solo capire cosa hai scritto !
    L'unica cosa che non mi è chiara è il funzionamento dell'interno del while che ad ogni passaggio arricchisce il primo elemento dell'array (anch'esso un array) di nuovi elementi. Ho capito quello che fa, ma non come, il che è probabilmente dovuto ad una mia carenza sugli array!

    Ad ogni modo adesso mi è tutto chiaro e quindi credo che modificherò la tua query in questo modo:
    Codice:
    SELECT articoli, sottotitolo
    FROM pagine JOIN (elenchi JOIN articoli USING (id_articoli)) ON pagine.id_pagine = elenchi.id_pagine
    WHERE pagine = 'pubblicazioni 2000'
    ORDER BY id_articoli
    Così lo ordino come avrei dovuto anche prima ed elimino una colonna praticamente inutile dato che contiene sempre la stessa stringa.
    Giusto per concludere volevo dire che mi si è presentato, con questa query, un problema di codifica, per cui le lettere accentate non si leggono più. So che è un problema molto frequente e sicuramente proverò a risolverlo da me. Poi, in caso di totale insuccesso, casomai aprirò un altro thread più attinente.
    Grazie mille ancora :=D
    Ultima modifica di Solon : 15-09-2010 alle ore 00.58.28

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da Solon Visualizza messaggio
    ...
    L'unica cosa che non mi è chiara è il funzionamento dell'interno del while che ad ogni passaggio arricchisce il primo elemento dell'array (anch'esso un array) di nuovi elementi. Ho capito quello che fa, ma non come, il che è probabilmente dovuto ad una mia carenza sugli array!
    ...
    Forse ti devo qualche spiegazione:
    - l'array $data è creato bidimensionale e la prima "dimensione" è in realtà una chiave non numerica: si utilizza come chiave il valore del campo "pagine" della query
    - quando al posto della dimensione si scrivono due parentesi vuote, si indica a PHP di riservare una nuova posizione (a cui sarà assegnato il primo indice numerico disponibile)

    Dato che hai rimosso la colonna "pagine", puoi (anzi, probabilmente dovrai, visto che non troverai più il campo "pagine") anche migliorare il codice PHP in modo analogo:
    - eliminando la prima chiave non numerica
    - sostituendo al ciclo foreach la sola istruzione contenuta al suo interno (eliminando anche in questo caso il richiamo alla chiave $k)

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  7. #7
    Solon non è connesso Neofita
    Data registrazione
    19-07-2009
    Messaggi
    4

    Predefinito

    Ah, ok! Avevo capito che era un array bidimensionale, ma non sapevo che si potessero fare quelle cose !
    Adesso ho anche risolto i problemi con gli accenti con urlencode() ed un altro paio di cosucce che prima, stranamente, non ci volevano.
    Ho poi ridotto ancora il tuo codice, perché il mio obiettivo, dall'inizio, era quello di avere le variabili $sottotitolo ed $articoli separate (cosa che facevo, dopo il GROUP_CONCAT, con vari explode()). Ma ora è tutto più limpido e funziona molto bene!
    Grazie per gli insegnamenti!
    Ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •