我有以下表格:
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/3
表格中的Action_set
与id_action
表的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的noob,所以不知道怎么做:(
编辑:此处我的表格(忽略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 :(得分: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)
我确信有更好的方法可以做到这一点,但这也有效。
答案 1 :(得分: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,所以我只假设
答案 2 :(得分: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