2011-11-01 21 views
12

मेरे पास एक तालिका People है। मैं प्रत्येक माता-पिता से युक्त एक HTML तालिका प्रदर्शित करना चाहता हूं, जिसमें उनके सभी बच्चे सीधे उनके नीचे हैं।प्रत्येक माता-पिता के सभी बच्चों को दिखा रहा है

_________ 
|People |_____________________________________________ 
|-------------------------------------------------------| 
| id  | parent | firstname  | lastname   | 
|-------------------------------------------------------| 
| 1  0  James   Donovan    | 
| 2  0  Jeffrey   Williams   | 
| 3  0  Emmit   Herring    | 
| 4  2  Carol   Williams   | 
| 5  2  Sarah   Williams   | 
| 6  1  Nikolai   Donovan    | 
|_______________________________________________________| 

अपेक्षित उत्पादन:

________________________________________________ 
|Jeffrey Williams        | 
|------------------------------------------------| 
| - Carol Williams        | 
| - Sarah Williams        | 
|________________________________________________| 
|James Donovan         | 
|------------------------------------------------| 
| - Nikolai Donovan        | 
|________________________________________________| 
|Emmit Herring         | 
|------------------------------------------------| 
|________________________________________________| 

मैं सही परिणाम पर पुनरावृति करने के लिए सेट से युक्त एक साहचर्य सरणी कैसे बनाऊं? मैं अंतिम सरणी बनाने के लिए सही एसक्यूएल और सही PHP के बारे में उलझन में हूं।

विशेष रूप से, मुझे यकीन है कि दो MySQL तालिकाओं के बीच पदानुक्रमित संबंध कैसे प्रदर्शित किया जाए। जहां तक ​​मुझे पता है एसक्यूएल परिणाम सेट बहुआयामी नहीं हैं। for लूप में SQL क्वेरी डालने से प्रदर्शन के लिए भयानक है। तो तुम क्या करते हो?

मुझे लगता है कि मैं MySQL में एक आसन्न सूची कार्यान्वयन की तलाश में हूं।

यह सवाल आसान होना चाहिए यदि मैं सबकुछ दो तालिकाओं में विभाजित कर सकता हूं, लेकिन दुर्भाग्य से मुझे इस गैर-सामान्य तालिका संरचना के साथ रहना होगा।

+0

आप jquery right का उपयोग कर सकते हैं ?? – defau1t

+0

मुझे प्रत्येक माता-पिता के बच्चों के रूप में सरल कुछ प्रदर्शित करने के लिए jQuery का उपयोग क्यों करना चाहिए? क्या यहां कोई PHP समाधान नहीं है? –

+0

@ मार्क मुझे लगता है कि मेरा प्रश्न पर्याप्त स्पष्ट नहीं था। मैं होमवर्क सहायता के लिए यहां नहीं हूँ। मैंने सवाल अपडेट किया। –

उत्तर

13

वहाँ यह करने के लिए कई तरीके हैं:

1. स्पष्ट एक पहले सभी माता पिता की एक सूची लाने के लिए, और फिर एक में हर माता-पिता के बच्चों के लिए एक अलग क्वेरी चलाने है पाश। आप कहते हैं कि यह "प्रदर्शन के लिए भयानक" है, लेकिन यह वास्तव में नहीं होना चाहिए, यह मानते हुए कि आपके पास parent कॉलम पर एक अनुक्रमणिका है और यह कि आपका MySQL सर्वर ग्रह के दूसरी तरफ स्थित नहीं है।


2. तुम सच में ऐसा करना चाहते हैं तो किसी एक क्वेरी में है, तो आप एक LEFT JOIN मेज पर खुद के खिलाफ उपयोग कर सकते हैं: फिर

SELECT 
    p.id AS parent_id, 
    p.firstname AS parent_firstname, 
    p.lastname AS parent_lastname, 
    c.id AS child_id, 
    c.firstname AS child_firstname, 
    c.lastname AS child_lastname 
FROM 
    People AS p 
    LEFT JOIN People AS c ON c.parent = p.id 
WHERE p.parent = 0 
ORDER BY p.id 

, तुम सच में, वास्तव मेंparent कॉलम पर एक अनुक्रमणिका की आवश्यकता है। ORDER BY खंड यह सुनिश्चित करने के लिए है कि प्रत्येक माता-पिता के बच्चे एक साथ क्रमबद्ध होते हैं; आप इसे बदल सकते हैं उदा। यदि आप वर्णमाला क्रम में क्रमबद्ध नाम चाहते हैं तो p.lastname, p.firstname, p.id, c.lastname, c.firstname, c.id जैसे कुछ। पीएचपी में, आप तो परिणामों पर पाश की जरूरत है और एक नया हैडर प्रिंट जब भी अभिभावक आईडी परिवर्तन की तरह, कुछ (और इस मामले में जहां child_* स्तंभों शून्य कर रहे हैं संभाल करने के लिए याद):

$res = mysql_query($sql); 
$last_parent_id = 0; 
while ($row = mysql_fetch_object($res)) { 
    if ($row->parent_id != $last_parent_id) { 
     // print parent header 
     $last_parent_id = $row->parent_id; 
    } 
    if ($row->child_id) { 
     // print child row 
    } 
} 

3।

$res = mysql_query("SELECT * FROM People"); // add WHERE clauses if needed 
$names = array(); 
$parents = array(); 
$children = array(); 

while ($row = mysql_fetch_object($res)) { 
    $names[ $row->id ] = array($row->firstname, $row->lastname); 
    if ($row->parent == 0) { 
     $parents[] = $row->id; 
    } else { 
     if (!array_key_exists($row->parent, $children)) 
      $children[ $row->parent ] = array(); 
     $children[ $row->parent ][] = $row->id; 
    } 
} 

foreach ($parents as $parent_id) { 
    // print parent header 
    if (array_key_exists($parent_id, $children)) { 
     foreach ($children[ $parent_id ] as $child_id) { 
      // print child row 
     } 
    } 
} 

पी.एस.: तीसरा विकल्प सिर्फ एक सरल SELECT * FROM People क्वेरी के साथ सभी पंक्तियों को लाने और PHP में पेड़ का निर्माण करना है। यदि आप वास्तव में सभी तालिका में माता-पिता और बच्चों को दिखाना नहीं चाहते हैं, लेकिन बस, एक परिवार से संबंधित लोगों का कहना है, तो आपको अभी भी बहुत सारे रिकॉर्ड लाने से बचने के लिए SQL में फ़िल्टरिंग करने का प्रयास करना चाहिए।

0

जावास्क्रिप्ट में एक मल्टीलाइनर सरणी क्यों नहीं बनाते? उसके बाद, अपने परिणामों को डोम में प्राप्त करने के लिए सरणी के माध्यम से बस लूप करें।

+1

क्योंकि वेबसाइट उपयोगकर्ताओं को जावास्क्रिप्ट सक्षम होना आवश्यक नहीं है। जावास्क्रिप्ट के साथ डोम को छेड़छाड़ करने के बिना आप माता-पिता -> बच्चों के रिश्तों की सूची क्यों नहीं दिखा सकते? मैं PHP और MySQL का उपयोग कर रहा हूँ। –

1

आप एक पाश में एक पाश इस्तेमाल कर सकते हैं:

$res = mysql_query("SELECT PARENT"); 
while($row = mysql_fetch_assoc($res)) 
{ 

    // echo parent 

    $res2 = mysql_query("SELECT CHILD WHERE PARENT SOMETHING"); 
    while($row2 = mysql_fetch_assoc($res2)) 
    { 

    // echo child 
    } 
} 

या, यह बाद के लिए रखें, और एक ध्वज की दुकान।

$people = array(); 

$res = mysql_query("SELECT PARENT"); 
while($row = mysql_fetch_assoc($res)) 
{ 
    $people[] = array('is_parent' => true, 
        'info'  => $row); 

    $res2 = mysql_query("SELECT CHILD WHERE PARENT SOMETHING"); 
    while($row2 = mysql_fetch_assoc($res2)) 
    {  
    $people[] = array('is_parent' => false, 
         'info'  => $row2); 
    } 
} 

// later 

foreach($people as $person) 
{ 
    if($person['is_parent']) 
    { 
    // echo parent 
    } 
    else 
    { 
    // echo child 
    } 
} 
+0

निश्चित रूप से आप कर सकते हैं, लेकिन जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, वैसे ही ऐसा करने से आपकी तालिका बढ़ने के कारण अस्वीकार्य प्रदर्शन समस्याएं होती हैं। –

2

पारंपरिक दृष्टिकोण के अनुसार, मुझे लगता है कि एसक्यूएल के साथ शुरू करना, टेबल में शामिल होना (भले ही बाएं टेबल और इस मामले में दायां टेबल समान होगा), एक अच्छा प्रारंभिक बिंदु हो सकता है।

यह मुख्य रूप से इसलिए है क्योंकि आरडीबीएमएस का उपयोग करना आपको हमेशा टैब्यूलर संरचनाओं से निपटना होगा, और तालिकाओं में शामिल होना चाहिए जिस तरह से आप डेटा स्थिरता के बारे में गारंटी देते हैं।

तो, की तरह कुछ के साथ शुरू:

SELECT 
     a.id parent_id, a.firstname parent_name, a.lastname parent_lastname, 
     b.id child_id, b.firstname child_firstname, b.lastname child_lastname 
FROM 
     People a LEFT OUTER JOIN People b ON a.id = b.parent 
WHERE 
     a.parent = 0; 

दूसरे, आप एक "fetch_all" रणनीति का प्रयोग को प्राथमिकता देनी चाहिए (mysqli php विस्तार के साथ, उदाहरण के लिए, लेकिन यह PDO भी साथ उपलब्ध है) है, जो दे देंगे आप एक एकल ऑपरेशन के साथ एक द्वि-आयामी सहयोगी सरणी में पूरा परिणाम सेट लाने की क्षमता रखते हैं।

इस बिंदु पर आप अपना रास्ता चुन सकते हैं।

ऑल-पीएचपी: आप ब्राउज़र के प्रति एचटीएमएल स्ट्रिंग में echo आपको आवश्यक डेटा को प्रदर्शित करने के लिए प्रस्तुति मार्कअप को सीधे PHP के साथ चल सकते हैं।

AJAX: अगर - उदाहरण के लिए - आपकी PHP स्क्रिप्ट को AJAX के माध्यम से बुलाया गया है, तो आप क्वेरी परिणाम सरणी भी चल सकते हैं, लेकिन इस बार इसे एक JSON संरचना बनाने के लिए व्याख्या कर रहा है जिसके साथ आप कॉल का जवाब देंगे, बस इस तरह:

{ 
    "1": { 
     "id": 1, 
     "firstname": "James", 
     "lastname": "Donovan", 
     "children": { 
      "6": { 
       "id": 6, 
       "firstname": "Nikolai", 
       "lastname": "Donovan" 
      } 
     } 
    }, 
    "2": { 
     "id": 2, 
     "firstname": "Jeffrey", 
     "lastname": "Williams", 
     "children": { 
      "4": { 
       "id": 4, 
       "firstname": "Carol", 
       "lastname": "Williams" 
      }, 
      "5": { 
       "id": 5, 
       "firstname": "Sarah", 
       "lastname": "Williams" 
      } 
     } 
    }, 
    "3": { 
     "id": 3, 
     "firstname": "Emmit", 
     "lastname": "Herring", 
     "children": { } 
    } 
} 

इस तरह के प्रतिनिधित्व डाटा इंटरचेंज के लिए बेहतर होगा, क्योंकि आपके क्लाइंट साइड जावास्क्रिप्ट मूल इसे पहचान सकता है और यह चलना एक पूर्व मौजूदा खाली तालिका कंकाल को भरने के लिए। निश्चित रूप से आप json_encode() को इस तरह के किसी अन्य चीज़ में पुनर्गठन के बजाय सीधे परिणाम सरणी प्राप्त कर सकते हैं, लेकिन आप स्वयं को ऐसा कुछ ढूंढ लेंगे जो आपके पास पहले से मौजूद ठोस रिकॉर्डसेट-जैसी सरणी प्रस्तुति से कहीं अधिक नहीं होगा।

अंत में, सभी-माइस्क्ल समाधान एक संग्रहित प्रक्रिया तैयार करना होगा जो प्रयोक्ता रूप से उस डेटा संरचना को तैयार करता है जिसे आप ढूंढ रहे हैं, उदा। प्रति पंक्ति 1 पंक्ति, माता-पिता का पूरा नाम पहले कॉलम के रूप में और बच्चों के पूर्ण नामों के बाद के कॉलम (खाली फ़ील्ड यदि व्यक्ति के पास बच्चे नहीं हैं, जैसे एमिट हेरिंग)।

आप फिर से PHP के साथ परिणाम सेट "fetch_all" कर सकते हैं, सरणी चलें और आप कर लेंगे।

तो यदि प्रदर्शन एक चिंता है, तो यह अंतिम दृष्टिकोण आपको सर्वोत्तम परिणामों के साथ गारंटी दे सकता है, भले ही यह कहा जाना चाहिए कि कम्प्यूटेशनल लोड और मेमोरी व्यवसाय के मामले में सर्वर द्वारा कीमत का भुगतान किया जाता है, यदि आप जा रहे हैं बड़ी मात्रा में डेटा के साथ सौदा।

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