2012-04-08 12 views
5

मैं एक कठिन समय इस पता लगाना हो रही है ...मैं दो mysql तालिकाओं को एक बड़े बहुआयामी सरणी में कैसे व्यवस्थित करूं?

मैं दो तालिकाओं ... ticket_winners, और टिकट

ticket_winners में

मेज, उपयोगकर्ता नाम/प्रोफ़ाइल जानकारी ... है

टिकट तालिका इन उपयोगकर्ताओं के पास एक उपयोगकर्ता आईडी के लिए सभी टिकट हैं, इस तालिका में प्रत्येक उपयोगकर्ता के लिए 10+ टिकट हो सकते हैं।

प्रश्न: मैं कैसे कर सकते हैं डेटा की दूसरी यात्रा जब तालिका टिकट 1 से अधिक प्रत्येक उपयोगकर्ता

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

पीएचपी पेज उदाहरण के लिए पंक्ति है के माध्यम से लूप: ठीक काम करता है

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

अब सरणी कैसा दिखता है:

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

टिकट तालिका को प्रत्येक उपयोगकर्ता के माध्यम से [1] सरणी में लूप नहीं किया जा रहा है। यह अन्य सभी उपयोगकर्ताओं के टिकट छोड़ देता है।

+0

अच्छी तरह से एक एसक्यूएल शामिल एक अच्छी शुरुआत की तरह लगता है ... –

+0

हाँ, मैंने कोशिश की।जब मैं एक जॉइन का उपयोग कर डेटा आउटपुट करता हूं, तो डुप्लिकेट पंक्तियां दिखायी जाती हैं, क्योंकि टिकट तालिका में एक ही उपयोगकर्ता के लिए एकाधिक प्रविष्टियां होती हैं। – Krunk

+0

धन्यवाद टोनी! – Krunk

उत्तर

3

टिकट_विनर टेबल पर बाएं शामिल होने का प्रयास करें, SELECT * का उपयोग न करें, ऐसा करने का बुरा अभ्यास है और जब आप जुड़ने का उपयोग करते हैं तो आपको प्रत्येक कॉलम को तालिका के नाम से जोड़ना चाहिए।

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 

बाईं में शामिल होने के अपने टिकट विजेताओं तालिका की तालिका प्रारूप को बरकरार रखता है और t.id संलग्न (tick_id के रूप में उत्पादन में) होगा, ticketId और उपयोगकर्ता नाम।

यह आपको एक से अधिक उपयोगकर्ताओं को शामिल करने वाला एक सरणी देगा, जो उन्हें एक में सॉर्ट करेगा जबकि लूप कठिन नहीं होगा क्योंकि आप केवल उपयोगकर्ता आईडी की कुंजी के साथ विजेता सरणी बनाते हैं, उस सरणी में जीतने वाली टिकट आईडी संलग्न करें।

$results = array(); 

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

जिसके परिणामस्वरूप सरणी:

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

यह एक करने की आवश्यकता समाप्त) दो अलग क्वेरी चला, और ख), जबकि एक समय पाश के भीतर पाश इस प्रक्रिया को तेज एक uneccesary बनाने से बचें। संभव के रूप में एक क्वेरी में

  1. जाओ के रूप में ज्यादा डेटा:

    एक अच्छा अभ्यास का पालन करने के लिए जब यह करने के लिए है।

  2. एक बार के माध्यम से लूप और डेटा को एक या एकाधिक सरणी में जोड़ने के कारण डुप्लीकेट को समाप्त करने के कारण सॉर्ट करें।
+0

धन्यवाद दोस्त! मैंने सबकुछ किया और यह काम करता है। वास्तव में सहायक टिप्पणी ... मैं भी प्रथाओं का पालन करूँगा। : डी – Krunk

+0

कोई समस्या नहीं :) खुशी है कि यह मदद की। (क्या आप जवाब स्वीकार कर लेंगे?) –

0

आपका डेटा, जैसा कि मैंने देखा है, $ परिणाम सरणी - टिकट-डेटा और टिकट_विनर-डेटा दोनों पर लागू होता है। तब आपका सवाल क्या है? शायद मैंने इसे पूरी तरह गलत समझा है।

+0

हाँ यह सही है। यदि आप सरणी उदाहरण देखते हैं, तो सरणी देखें [2], उस उपयोगकर्ता के टिकटों को लुप्त नहीं किया जा रहा है। यह [1] सरणी पर रुक जाता है और केवल 10+ टिकट वाले प्रत्येक उपयोगकर्ता के 1 टिकट दिखाता है। – Krunk

संबंधित मुद्दे