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/3に、Action_setテーブルの fks がid_actionありActionます。

の行の 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次のように、別の列に結果を表示できます。

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 に答える
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_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 に答える