2012-01-13 4 views
5

मेरे पास 5 टेबल हैं। एक प्राथमिक और 4 अतिरिक्त (उनके पास अलग-अलग कॉलम हैं)।MySQL टेबल में शामिल हों जहां तालिका का नाम किसी अन्य तालिका का क्षेत्र है

  1. वस्तुओं
  2. obj_mobiles
  3. obj_tablets
  4. obj_computers

यहाँ मेरी मुख्य तालिका (वस्तुओं) की संरचना है।

आईडी | टाइप करें | नाम | आदि ...

तो मैं टाइप क्षेत्र के आधार पर अन्य (obj_mobiles, obj_tablets, ...) तालिकाओं के साथ वस्तुओं में शामिल होना चाहता हूं। मुझे पता है कि मुझे गतिशील एसक्यूएल का उपयोग करना चाहिए। लेकिन मैं प्रक्रिया नहीं कर सकता। मुझे लगता है कि यह इस तरह कुछ दिखना चाहिए।

SELECT objects.type into @tbl FROM objects; 
PREPARE stmnt FROM "SELECT * FROM objects AS object LEFT JOIN @tbl AS info ON object.id = info.obj_id"; 
EXECUTE stmnt; 
DEALLOCATE PREPARE stmnt; 

विस्फोट छद्म कोड

SELECT * FROM objects LEFT JOIN [objects.type] ON ... 

किसी पद प्रक्रिया कर सकते हैं? इसके अलावा मैं सभी पंक्तियों को सिर्फ 1 पंक्ति नहीं चाहता हूं। धन्यवाद।

उत्तर

7

आप एक समय में सभी पंक्तियों (थोक उत्पादन) और एक पंक्ति नहीं चाहते हैं तो नीचे तेजी से होना चाहिए और यह भी सभी पंक्तियों के लिए उत्पादन सभी कॉलम होंगे।

आइए टेबल के फ़ील्ड होने के लिए नीचे विचार करें। obj_mobiles - आईडी | एम 1 | एम 2 obj_tablets - आईडी | टी 1 | टी 2 obj_computers - आईडी | सी 1 | सी 2 ऑब्जेक्ट्स - आईडी | टाइप करें | नाम | आदि,

Select objects.*, typestable.* 
from (
    select ID as oID, "mobile" as otype, M1, M2, NULL T1, NULL T2, NULL C1, NULL C2 from obj_mobiles 
    union all 
    select ID as oID, "tablet" as otype, NULL, NULL, T1, T2, NULL, NULL from obj_tablets 
    union all 
    select ID as oID, "computer" as otype, NULL, NULL, NULL, NULL, C1, C2 from obj_computers) as typestable 
     left join objects on typestable.oID = objects.ID and typestable.otype = objects.type; 

+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 
| ID | name    | type  | ID | type  | M1 | M2 | T1 | T2 | C1 | C2 | 
+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 
| 1 | Samsung Galaxy s2 | mobile | 1 | mobile | 1 | Thin | NULL | NULL | NULL | NULL | 
| 2 | Samsung Galaxy Tab | tablet | 2 | tablet | NULL | NULL | 0.98 | 10 | NULL | NULL | 
| 3 | Dell Inspiron  | computer | 3 | computer | NULL | NULL | NULL | NULL | 4.98 | 1000 | 
+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 

तालिका नीचे दी गई है।

mysql> create table objects (ID int, name varchar(50), type varchar (15)); 
Query OK, 0 rows affected (0.05 sec) 
mysql> insert into objects values (1, "Samsung Galaxy s2", "mobile"), (2, "Samsung Galaxy Tab", "tablet"), (3, "Dell Inspiron", "computer"); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 


mysql> create table obj_mobiles (ID int, M1 int, M2 varchar(10)); 
Query OK, 0 rows affected (0.03 sec) 
mysql> insert into obj_mobiles values (1, 0.98, "Thin"); 
Query OK, 1 row affected (0.00 sec) 


mysql> create table obj_tablets (ID int, T1 float, T2 int(10)); 
Query OK, 0 rows affected (0.03 sec) 
mysql> insert into obj_tablets values (2, 0.98, 10); 
Query OK, 1 row affected (0.00 sec) 


mysql> create table obj_computers (ID int, C1 float, C2 int(10)); 
Query OK, 0 rows affected (0.03 sec) 
insert into obj_computers values (3, 4.98, 1000); 

भी पुष्टि करने के लिए स्तंभों की डेटाटाइप्स मूल स्तंभों के रूप में ही कर रहे हैं, परिणाम एक तालिका में सहेजा जाता है और डेटाटाइप्स नीचे जाँच कर रहे हैं।

create table temp_result as 
Select objects.*, typestable.* 
from (
    select ID as oID, "mobile" as otype, M1, M2, NULL T1, NULL T2, NULL C1, NULL C2 from obj_mobiles 
    union all 
    select ID as oID, "tablet" as otype, NULL, NULL, T1, T2, NULL, NULL from obj_tablets 
    union all 
    select ID as oID, "computer" as otype, NULL, NULL, NULL, NULL, C1, C2 from obj_computers) as typestable 
     left join objects on typestable.oID = objects.ID and typestable.otype = objects.type; 

mysql> desc temp_result; 
+-------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+-------------+------+-----+---------+-------+ 
| ID | int(11)  | YES |  | NULL |  | 
| name | varchar(50) | YES |  | NULL |  | 
| type | varchar(15) | YES |  | NULL |  | 
| oID | int(11)  | YES |  | NULL |  | 
| otype | varchar(8) | NO |  |   |  | 
| M1 | int(11)  | YES |  | NULL |  | 
| M2 | varchar(10) | YES |  | NULL |  | 
| T1 | float  | YES |  | NULL |  | 
| T2 | int(11)  | YES |  | NULL |  | 
| C1 | float  | YES |  | NULL |  | 
| C2 | int(11)  | YES |  | NULL |  | 
+-------+-------------+------+-----+---------+-------+ 
11 rows in set (0.00 sec) 
+0

यह Devart –

+0

द्वारा समाधान से अधिक तेज़ होगा। यही वह है जिसे मैं ढूंढ रहा हूं। – Cyberon

0

उपयोग concat अपने तैयार बयान बनाने के लिए। उदाहरण के लिए।

@sql = CONCAT('SELECT * FROM objects AS object LEFT JOIN ', @tbl, ' AS info ON object.id = info.obj_id'); 
PREPARE stmnt FROM @sql; 
... 
3

तो objects एक माता पिता की मेज इसका मतलब है कि objects है। ID एक अद्वितीय वस्तु है। सही? अन्य सभी आइटम (मोबाइल, टैबलेट, कंप्यूटर) ऑब्जेक्ट के लिए बच्चे हैं और मोबाइल और टैबलेट में एक ही आईडी नहीं हो सकती है। यदि हां, तो यह इस सरल क्वेरी का उपयोग करने के लिए पर्याप्त है -

SELECT * FROM objects o 
    LEFT JOIN obj_mobiles m 
    ON o.id = m.ID 
    LEFT JOIN obj_tablets t 
    ON o.id = t.ID 
    LEFT JOIN obj_computers c 
    ON o.id = c.ID 

प्रकार फिल्टर करने के लिए कहां खंड, उदा .: कहां o.type = 'मोबाइल' जोड़ें।

+0

कम प्रदर्शन के साथ बेहतर प्रदर्शन क्वेरी के लिए मेरा समाधान देखें। –