2012-01-13 110 views
5

我有5個表。一個小學和另外4個(他們有不同的專欄)。MySQL連接表,其中表名是另一個表的字段

  1. 對象
  2. obj_mobiles
  3. obj_tablets
  4. obj_computers

這是我的主表(對象)的結構。

ID |鍵入|名稱|等等...

所以我想要做的是加入對象與其他(obj_mobiles,obj_tablets,...)表,這取決於類型字段。 我知道我應該使用動態SQL。但我無法制作程序。我認爲它應該看起來像這樣。

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僞代碼

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

任何人都可以交的程序?另外我想要所有行不只是1行。 謝謝。

回答

7

如果你想要所有的行(批量輸出),而不是一次一行,下面應該是快速的,並且所有行的輸出將包含所有列。

讓我們考慮以下是表格的字段。 obj_mobiles - ID | M1 | M2 obj_tablets - ID | T1 | T2 obj_computers - ID | C1 | C2 objects - ID |鍵入|名稱|

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的解決方案更快 – 2012-01-19 09:37:17

+0

謝謝。這是我一直在尋找的。 – Cyberon 2012-01-19 17:39:37

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是一個父表就意味着objectsID是一個獨特的對象。對?所有其他物品(手機,平板電腦,電腦)都是兒童用品,手機和平板電腦不能擁有相同的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 

添加WHERE子句來過濾類型,例如:WHERE o.type =「移動」。

+0

請檢查我的解決方案以獲得更好的性能查詢,並減少連接數。 – 2012-01-19 09:39:11

相關問題