Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    È possibile raggruppare i risultati di una join?

    Ho questa query:
    codice:
    "SELECT `users`.`id`, `users_values`.`id_attribute`, `users_values`.`value` FROM `users`
     LEFT JOIN `users_values` ON users_values.id_user = users.id"
    che mi restituisce un array contenente tante righe per quanti users_values trova per ogni utente

    per esempio:

    Codice PHP:
    [0] => array(3) {
        [
    "id"] => string(1"1"
        
    ["id_attribute"] => string(1"1"
        
    ["value"] => string(5"valore 1"
      
    }
      [
    1] => array(3) {
        [
    "id"] => string(1"1"
        
    ["id_attribute"] => string(2"34"
        
    ["value"] => string(6"valore 34"
      
    }
      [
    2] => array(3) {
        [
    "id"] => string(2"15"
        
    ["id_attribute"] => NULL
        
    ["value"] => NULL
      

    è possibile ottenere da una singola query qualcosa di simile a questo:

    Codice PHP:
    [0] => array(2) {
        [
    "id"] => string(1"1"
        
    ["values"] = array{
            [
    0] = array(2){
                [
    "id_attribute"] => string(1"1"
                
    ["value"] => string(5"valore 1"
            
    }
            [
    1] = array(2){
                [
    "id_attribute"] => string(1"34"
                
    ["value"] => string(6"valore 34"
            
    }
          }
        }
      [
    1] => array(2) {
        [
    "id"] => string(2"15"
        
    ["values"] => NULL
      

    ossia i valori della join raggruppati in "values"?

    E in fine, mi consigliereste un bel libro sui database?
    Arjuna

    finding solutions

  2. #2

  3. #3
    Ora sto usando MySql
    Arjuna

    finding solutions

  4. #4
    quindi tu hai qualcosa del genere

    user_1 paperino
    user_2 topolino
    user_1 qui
    user_1 quo
    user_1 qua
    user_2 tip
    user_2 tap

    e vorresti

    user_1: paperino, qui, quo, qua
    user_2: topolino, tip, tap

    corretto?

  5. #5
    si, più o meno così, come ho scritto negli esempi che dovrebbero essere un print_r() del risultato
    Arjuna

    finding solutions

  6. #6

  7. #7
    ci siamo quasi ma non esattamente.

    GROUP_CONCAT ritorna una stringa con i valori separati da virgola ma nel mio caso si tratta di coppie di valori: id_attribute => value, quindi un array

    ho visto un pò le altre funzioni di mysql ma non trovo nulla al riguardo
    Arjuna

    finding solutions

  8. #8
    Originariamente inviato da 99caos
    si, più o meno così, come ho scritto negli esempi che dovrebbero essere un print_r() del risultato
    puoi allora postare l'esempio corretto sulla falsariga del mio?

  9. #9
    ovviamente non puoi in alcun modo fare una cosa del genere direttamente tramite il database:
    - quello che tu chiedi riguarda DIRETTAMENTE php e non il database che ti restituisce i dati
    - MySQL, cosi come qualsiasi altra piattaforma, contengono i dati che tu vai ad estrarre e questi sono "liste" su tabelle diverse, al massimo in questi dati che vai a estrarre puoi serializzare/deserializzare degli oggetti ( www.php.net/serialize www.php.net/unserialize ) cosi da avere quasi quello che vuoi (essendo serializzati, però, non puoi fare ricerche con semplicità all'interno)

    Poi per carità, ci sono delle estensioni per DB2 che ad esempio ti permettono di buttare fuori dell'XML, cosi come altre piattaforme, ma non so se comunque ti permettono di fare una cosa direttamente da una query, ovvero senza passare da una stored procedure o da una subquery (la join mette di fila tutto, la subquery si capisce che è una "ramificazione" della query e quindi potrebbe anche essere strutturata come vuoi tu con apposite estensioni solo che sono più lente e pesanti dato che verrebbe eseguita una subquery per ogni riga dell'utente che vai ad estrarre

    La soluzione più semplice è ovviamente modificare il ciclo While che ti crea l'elenco per far si che ti crei la struttura che vuoi tu, qualcosa tipo

    Codice PHP:
    $sql "SELECT `users`.`id`, `users_values`.`id_attribute`, `users_values`.`value` FROM `users` LEFT JOIN `users_values` ON users_values.id_user = users.id";
    $query mysql_query($sql) or die("Errore nella query
    <pre>" 
    $sql "</pre>

    <pre>" 
    mysql_error() . "</pre>
    "
    );

    $users = array();
    while(
    $row mysql_fetch_object($query))
    {
      if (isset(
    $users[$row->id]) === false)
      {
        
    $user = new stdClass;
        
    $user->Id $row->id;
        
    $user->Values = array();
        
    $users[$row->id] = $user;
      }

      
    $users[]->Values[$row->id_attribute] = $row->value
    }

    mysql_free_result($query); 
    PS: sposto il thread in PHP

  10. #10
    quello che volevo era qualcosa tipo

    user_1 : 1 => 'valore 1', 2 => 'valore 2'
    user_2 : 1 => 'valore 1', 2 => 'valore 2'

    anche se viste le difficoltà (o le impossibilità), ho scelto un'altra strada, faccio prima la query per ricavare gli utenti e poi una query per ogni utente per ricavare i valori.

    questo su un rowset di 100 utenti può essere poco performante ma a questo punto mi sa che mi conviene memorizzare in una cache i valori che mi servono in modo da non fare ogni volta troppe query
    Arjuna

    finding solutions

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.