0

我有以下表格:

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 。id_actionAction

对于行中的每个 id,Action_set我需要在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

还有怎么优化呢?

4

3 回答 3

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)

** 所有带有 id_action 的 action_set ** 因为 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,所以我只是假设

于 2012-06-19T19:47:26.130 回答
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)

我确信存在更好的方法来做到这一点,但这也有效。

于 2012-06-19T19:41:36.180 回答
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
于 2012-06-19T20:00:07.763 回答