2012-04-08 9 views
5

Sto avendo difficoltà a capire questo fuori ...Come organizzo due tabelle mysql in un unico grande array multidimensionale?

Ho due tavoli ... ticket_winners, e biglietti

nelle ticket_winners tabella, nomi utente/informazioni del profilo ...

il biglietti tabella è tutti i ticket che questi utenti hanno per un ID utente, ci potrebbero essere più di 10 biglietti per ogni utente in questa tabella.

Domanda: Come posso ciclo attraverso la seconda iterazione dei dati quando la tabella biglietti ha più di 1 riga per ogni utente

function pullTickets() { 
    $sql = $this->mysql->retrieve("SELECT * FROM ticket_winners ORDER BY id DESC LIMIT 5"); 
    $sql2 = $this->mysql->retrieve("SELECT id, userId, ticketId FROM tickets ORDER BY id ASC LIMIT 5"); 
    while($row = mysql_fetch_array($sql)) { 
     $results[$row['id']]['user'] = $row['userId']; 

     while($row2 = mysql_fetch_array($sql2)) { 
      if($results[$row['id']]['user'] == $row2['userId']) { 
       $results[$row['id']]['tickets'][$row2['id']] = $row2['ticketId']; 
      } else { 
      } 
     } 

    } 
    return $results; 
} 

pagina PHP esempio: funziona bene

$data = $obj->pullTickets(); 
foreach($data as $user) { 
    echo $user['username']; 
    foreach($data['ticket'] as $ticket) { 
     echo $ticket['ticketId']; 
    } 
} 

L'aspetto della matrice ora:

[1] => Array 
    (
     [batch] => 1 
     [userId] => 200 
     [userName] => Craig 
     [tickets] => Array 
      (
       [1] => GH7JNm72hN 
       [2] => JudM3rT3is 
       [3] => KiLPoXCmDF 
      ) 

    ) 
[2] => Array 
    (
     [batch] => 1 
     [userId] => 100 
     [userName] => Hewbie 
     needs to continue looping 
    ) 

la tabella dei ticket non viene eseguita in loop su ciascun utente come nell'array [1]. Salta tutti i biglietti degli altri utenti.

+0

Beh un join sql sembra un buon inizio ... –

+0

sì, ci ho provato.quando emetto i dati utilizzando un join, vengono visualizzate le righe duplicate, poiché la tabella dei ticket ha più voci per lo stesso utente. – Krunk

+0

Grazie Tony! – Krunk

risposta

3

Provare un join sinistro nella tabella ticket_winners, non utilizzare SELECT *, è una cattiva pratica farlo e quando si utilizzano i join è necessario aggiungere ogni colonna con il nome della tabella.

SELECT tw.id,tw.userid,t,userName,t.id AS tick_id, t.ticketId 
    FROM `ticket_winners` AS tw 
LEFT JOIN `tickets` AS t 
    ON tw.userid = t.userid 
ORDER BY tw.id DESC LIMIT 5 

La sinistra unirsi conserva il formato tabella del biglietto tavolo vincitori e aggiungerà t.id (in uscita come tick_id), TICKETID e username.

Questo ti darà un array composto da più utenti, ordinandoli in un ciclo while non sarà difficile poichè crei semplicemente un array di vincitori con la chiave dell'idenzideo, all'interno di quell'array aggiungi l'id del biglietto vincente.

$results = array(); 

while ($sql = mysql_fetch_array($query, MYSQL_ASSOC) { 
    $results[$sql['userid']]['userName'] = $sql['user']; 
    $results[$sql['userid']]['tickets'][] = $sql['tick_id']; 
} 

La matrice risultante:

[1] => array 
    (
    ['userName'] => 'Craig', 
    ['tickets'] => array 
     (
     [0] => 'GH7JNm72hN', 
     [1] => 'JudM3rT3is' 
     ) 
    ) 
[2] => array 
    (
    ['userName'] => 'Adam', 
    ['tickets'] => array 
     (
     [0] => 'GfdT24sDgC' 
     ) 
    ) 

Questo elimina la necessità di a) eseguire due query separate, e b) evitare di creare un uneccesary while all'interno di un ciclo, velocizzando il processo fino.

Una buona pratica da seguire quando si fa questo è:

  1. ottenere quanto più i dati in una query possibile.
  2. Passa attraverso una volta e ordina i dati in uno o più array eliminando le duplicazioni dovute ai join.
+0

Grazie amico! Ho fatto tutto e funziona. Commento davvero utile ... Seguirò anche le pratiche. : D – Krunk

+0

Nessun problema :) contento che abbia aiutato. (ti dispiacerebbe accettare la risposta?) –

0

I dati sono, come vedo, applicati all'array $ result - sia i dati ticket che i dati ticket_winner. Qual è la tua domanda allora? Forse l'ho totalmente frainteso.

+0

sì, è corretto. Se si guarda l'esempio dell'array, si veda array [2], i ticket per quell'utente non sono in loop. Si ferma sull'array [1] e mostra solo 1 biglietto per ogni utente che ha più di 10 biglietti. – Krunk

Problemi correlati