2012-04-08 14 views
5

...İki mysql tablasını bir büyük çok boyutlu dizide nasıl düzenlerim? Bunu anlamakta zorlanıyorum

İki tablo ... ticket_winners ve bilet ticket_winners içinde

tablo, kullanıcı/profil bilgileri var ...

biletler masa, bu kullanıcı için bir kullanıcıID var, bu masadaki her kullanıcı için 10 + bilet olabilir biletleri.

Soru: tablo biletler her kullanıcı

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; 
} 

PHP sayfası örneği için 1'den fazla satır var verilerin ikinci tekrarında döngü I nasıl: iyi çalışıyor

Bu tablo şu andaki gibi görünüyor:

[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 
    ) 

Bilet tablosu, [1] dizisinde olduğu gibi her kullanıcı tarafından döngülenmiyor. Diğer tüm kullanıcıların biletlerini atlar.

+0

İyi bir başlangıç, iyi bir başlangıç ​​gibi görünüyor ... –

+0

Evet, bunu denedim.Bir birleştirmeyi kullanarak veri çıkışı yaptığımda, bilet tablosunda aynı kullanıcı için birden çok girdi bulunduğu için, yinelenen satırlar gösterilir. – Krunk

+0

Teşekkür ederim Tony! – Krunk

cevap

3

ticket_winners tablosunda bir sol birleştirmeyi deneyin, SELECT * kullanmayın, bunu yapmak kötü bir uygulamadır ve katılımları kullanırken her bir sütunu tablo adıyla eklemelisiniz. Sol katılmak

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 

TICKETID ve userName, biletiniz kazanan tablonun tablo biçimini koruyan ve (tick_id olarak çıktıda) t.id ekler.

Bu, birden çok kullanıcının oluşturduğu bir diziyi sunacak, bunları bir arada sıralayacaktır. Basitçe kazanan kullanıcı kimliğiyle bir kazananlar dizisi oluştururken, bu dizi içinde kazanan bilet kimliğini ekleyeceğiniz döngü zor olmayacaktır.

$results = array(); 

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

elde edilen dizi:

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

Bu) bir ihtiyacını ortadan kaldırır iki ayrı sorguları çalıştırmak, ve b) bir süre döngü içinde döngü bu sürecini hızlandırmak sırasında bir uneccesary oluşturma kaçının. Bunu yaparken olduğunda

İyi bir uygulama

takip etmek:

  1. alın kadar veri sürede tek bir sorguda.
  2. Bir kez geçirin ve birleştirmeler nedeniyle çoğaltmaları ortadan kaldırarak verileri bir veya daha fazla diziye ayırın.
+0

Teşekkürler dostum! Her şeyi yaptım ve işe yarıyor. Gerçekten yararlı yorum ... Ben de uygulamaları takip edeceğim. : D – Krunk

+0

Sorun değil :) Yardım ettiğine sevindim. (cevabı kabul eder misiniz?) –

0

Verileriniz, gördüğünüz gibi, $ sonuç dizisine uygulanır - hem bilet verileri hem de ticket_winner verileri. Sorunun nedir o zaman? Belki de tamamen yanlış anlamışımdır.

+0

evet, bu doğru. Dizi örneğine bakarsanız, dizi [2] 'ye bakın, o kullanıcının biletine girilmiyor. [1] dizisinde durur ve her kullanıcının 10 + bilet içeren 1 biletini gösterir. – Krunk

İlgili konular