2012-06-19 132 views
0

我有以下表格:越來越多行與許多IDS

Action_set 
id_action_p1 | id_action_p2 | id_action_p3 | etc. 
1   | 1   | 2 
2   | 3   | 1 
1   | 1   | 1 

Action 
id_action | id_type | value 
1   | 0  | NULL 
2   | 1  | NULL 
3   | 2  | NULL 

id_action_p1/2/3Action_set表是FKS至Actionid_action

對於Action_set中每行的每個id,我需要獲取Action中的相應行。

例如,讓我們Action_set的第一行:

(id_action_p1 | id_action_p2 | id_action_p3) 
1 | 1 | 2 

必須給我的結果:

(id_type | value) 
0 | NULL 
0 | NULL 
1 | NULL 

我小白與MySQL,所以不知道該怎麼辦:(

編輯:這裏我表(忽略id_lap

CREATE TABLE IF NOT EXISTS `Action` (
    `id_action` int(11) NOT NULL AUTO_INCREMENT, 
    `value` int(11) DEFAULT NULL, 
    `id_type` tinyint(4) NOT NULL, 
    PRIMARY KEY (`id_action`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ; 

INSERT INTO `Action` (`id_action`, `value`, `id_type`) VALUES 
(1, NULL, 0), 
(2, NULL, 1), 
(3, NULL, 2), 
(4, NULL, 3), 
(5, NULL, 4), 
(6, NULL, 5); 


CREATE TABLE IF NOT EXISTS `Action_set` (
    `id_action_set` int(11) NOT NULL AUTO_INCREMENT, 
    `id_lap` int(11) NOT NULL, 
    `id_parent_action_set` int(11) DEFAULT NULL, 
    `id_action_pu` int(11) DEFAULT NULL, 
    `id_action_p1` int(11) DEFAULT NULL, 
    `id_action_p2` int(11) DEFAULT NULL, 
    `id_action_p3` int(11) DEFAULT NULL, 
    `id_action_p4` int(11) DEFAULT NULL, 
    `id_action_p5` int(11) DEFAULT NULL, 
    `id_action_p6` int(11) DEFAULT NULL, 
    `id_action_p7` int(11) DEFAULT NULL, 
    `id_action_p8` int(11) DEFAULT NULL, 
    `id_stage` tinyint(4) NOT NULL, 
    PRIMARY KEY (`id_action_set`), 
    KEY `fk_Action_set_Lap` (`id_lap`), 
    KEY `fk_Action_set_Action_set1` (`id_parent_action_set`), 
    KEY `fk_pu` (`id_action_pu`), 
    KEY `fk_p1` (`id_action_p1`), 
    KEY `fk_p2` (`id_action_p2`), 
    KEY `fk_p3` (`id_action_p3`), 
    KEY `fk_p4` (`id_action_p4`), 
    KEY `fk_p5` (`id_action_p5`), 
    KEY `fk_p6` (`id_action_p6`), 
    KEY `fk_p7` (`id_action_p7`), 
    KEY `fk_p8` (`id_action_p8`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11; 

INSERT INTO `Action_set` (`id_action_set`, `id_lap`, `id_parent_action_set`, `id_action_pu`, `id_action_p1`, `id_action_p2`, `id_action_p3`, `id_action_p4`, `id_action_p5`, `id_action_p6`, `id_action_p7`, `id_action_p8`, `id_stage`) VALUES 
(1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 2, 2, 0), 
(2, 1, 1, 1, 1, 1, 1, 2, 1, NULL, NULL, NULL, 0), 
(3, 1, 2, NULL, NULL, NULL, NULL, NULL, NULL, 4, 4, 4, 1), 
(4, 1, 3, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 1), 
(5, 1, 4, NULL, NULL, NULL, NULL, NULL, NULL, 3, 1, 1, 2), 
(6, 1, 5, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, 2), 
(7, 1, 1, 2, 1, 2, 1, 1, 1, NULL, NULL, NULL, 0), 
(8, 1, 7, NULL, NULL, NULL, NULL, NULL, NULL, 4, 4, 4, 1), 
(9, 1, 8, 4, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 1), 
(10, 1, 9, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1, 1, 2); 

編輯2個

好傢伙,我發現這個解決方案,只返回預期:

SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p1 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p2 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p3 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p4 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p5 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p6 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p7 AND id_action_set = 1 
UNION ALL 
SELECT id_type, value FROM Action, Action_set WHERE id_action = id_action_p8 AND id_action_set = 1 

還有就是如何優化呢?

+0

您的密鑰是如何定義的?你可以添加創建表SQL嗎? – Jeremy

+0

你的表Action_set看起來很奇怪。爲什麼你有三行外鍵?沒有主要的 – nischayn22

+0

@Jeremy:更新。 – Fabricio

回答

0
select id_type, value from Action where id_action in 
(select id_p1 as id from Action_set limit 0,1 union all 
select id_p2 as id from Action_set limit 0,1 union all 
select id_p3 as id from Action_set limit 0,1) 

我相信有更好的方法來做到這一點,但這也有效。

+0

你的答案是最接近的。檢查我的新更新。 – Fabricio

0

不知道如何使用實際的表數據,這給了我你正在尋找的結果。

與定義action_set

SELECT id_type, value 
FROM action 
    LEFT JOIN action_set ON (id_action = id_action_set) 
WHERE id_action_set = 1 

這將有助於更新您原來的職位,以使用實際的表數據字段,以獲得更準確的反應。希望這會幫助你朝着正確的方向前進。由於您使用的是FK,因此上面的LEFT JOIN幾乎是無用的(假設您在更改時更新了它)。我只需要更多的信息給你正確的查詢。除非別人已經明白你想要完成什麼......我仍然有點迷路。

**所有action_set是**

SELECT id_type, value 
FROM action 
    LEFT JOIN action_set ON (id_action = id_action_set) 

**所有action_set是與id_action ** 由於id_action = id_action_set

SELECT id_action, id_type, value 
FROM ACTION 
    LEFT JOIN action_set ON (id_action = id_action_set) 

我是在假設id_action = id_action_set 我糾正沒有你提供的SQL中的FK,所以我只假設

+0

,這並沒有給我預期的結果。對於每個Action_set列的每個id,我需要得到正確的Action行。 – Fabricio

+0

更新了我的帖子 – Jeremy

+0

我剛剛看到你更新了你的帖子。讓我看看它,我會更新這個帖子,我可以找出 – Jeremy

0

你可以得到Action結果在單獨列像這樣:

SELECT 
    a.* 
    b.id_type AS p1_type, b.value AS p1_value, 
    c.id_type AS p2_type, c.value AS p2_value, 
    d.id_type AS p3_type, d.value AS p3_value 
FROM 
    Action_set a 
INNER JOIN 
    Action b ON a.id_action_p1 = b.id_action 
INNER JOIN 
    Action c ON a.id_action_p2 = c.id_action 
INNER JOIN 
    Action d ON a.id_action_p3 = d.id_action 

這將使你的線沿線的一個結果集:

id_p1 | id_p2 | id_p3 | p1_type | p1_value | p2_type | p2_value | p3_type | p3_value 
1  | 1  | 2  | 0  | NULL  | 0  | NULL  | 1  | NULL 
... 
... 

這將是一個理想的解決方案,但如果你需要得到的結果是在行,你可以這樣做:

SELECT 
    * 
FROM 
    (
     SELECT aa.*, bb.id_type, bb.value 
     FROM Action_set aa 
     INNER JOIN Action bb ON aa.id_action_p1 = bb.id_action 

     UNION ALL 

     SELECT aa.*, bb.id_type, bb.value 
     FROM Action_set aa 
     INNER JOIN Action bb ON aa.id_action_p2 = bb.id_action 

     UNION ALL 

     SELECT aa.*, bb.id_type, bb.value 
     FROM Action_set aa 
     INNER JOIN Action bb ON aa.id_action_p3 = bb.id_action 
    ) a 
ORDER BY 
    a.id_action_p1, 
    a.id_action_p2, 
    a.id_action_p3, 
    a.id_type 

這會給你一個結果集,如:

id_action_p1 | id_action_p2 | id_action_p3 | id_type | value 
1   | 1   | 2   | 0  | NULL 
1   | 1   | 2   | 0  | NULL 
1   | 1   | 2   | 1  | NULL 
+0

檢查我的新更新 – Fabricio