2012-01-13 36 views
5

Tôi có 5 bảng. Một chính và 4 bổ sung (chúng có các cột khác nhau).MySQL tham gia các bảng có tên bảng là trường của một bảng khác

  1. đối tượng
  2. obj_mobiles
  3. obj_tablets
  4. obj_computers

Dưới đây là cấu trúc của bảng chính của tôi (đối tượng).

ID | loại | tên | vv ...

Vì vậy, điều tôi muốn làm là nối các đối tượng với các bảng khác (obj_mobiles, obj_tablets, ...), tùy thuộc vào trường loại. Tôi biết rằng tôi nên sử dụng SQL động. Nhưng tôi không thể làm thủ tục. Tôi nghĩ rằng nó sẽ giống như thế này.

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; 

Aslo pseudo-code

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

Can thủ tục bài ai? Ngoài ra tôi muốn có tất cả các hàng không chỉ 1 hàng. Cảm ơn.

Trả lời

7

Nếu bạn muốn tất cả các hàng (đầu ra hàng loạt) và không phải một hàng tại một thời điểm, dưới đây phải nhanh và đầu ra cho tất cả các hàng sẽ chứa tất cả các cột.

Cho phép xem xét dưới đây là các trường của bảng. obj_mobiles - ID | M1 | M2 obj_tablets - ID | T1 | T2 obj_computers - ID | C1 | C2 đối tượng - ID | loại | tên | vv,

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 | 
+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 

Bảng được tạo như sau.

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

cũng để xác nhận kiểu dữ liệu của cột giống như cột ban đầu, kết quả được lưu vào bảng và kiểu dữ liệu được chọn bên dưới.

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

Điều này sẽ nhanh hơn giải pháp của Devart –

+0

Cảm ơn bạn. Đây là những gì tôi đang tìm kiếm. – Cyberon

0

SỬ DỤNG CONCAT để tạo câu lệnh chuẩn bị của bạn. ví dụ:

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

Nếu objects là bảng cha, nghĩa là objects. ID là một đối tượng duy nhất. Đúng? Tất cả các mục khác (điện thoại di động, máy tính bảng, máy tính) là các mục con cho đối tượng và thiết bị di động và máy tính bảng không thể có cùng một ID. Nếu vậy, đủ để sử dụng truy vấn đơn giản này -

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 

Thêm mệnh đề WHERE để lọc các loại, ví dụ: WHERE o.type = 'mobile'.

+0

Kiểm tra giải pháp cho truy vấn hiệu suất tốt hơn, với sự tham gia ít hơn. –

Các vấn đề liên quan