MySQL相当于PHP Explode()

时间:2014-04-17 05:37:59

标签: php mysql sql

假设我在一个包含以下数据的表中有一个MySQL列

1,2,3。实际上,这些是另一个表的primary_key。现在,让我说出我想要做的事情。

我想使用comma (,)对这些内容进行分解,并希望创建一个sub query来从另一个表中获取信息。

我在这里给出两个表数据,希望能帮助你正确理解..

tableA

------------------------------------
| col1       | col2      | col3    |
------------------------------------
| 1          | Sam       | 50      |
------------------------------------
| 2          | Zor       | 55      |
------------------------------------
| 3          | Sad       | 40      |
------------------------------------

tableB

--------------------------------
| col1       | idFromTableA    |
--------------------------------
| 1          | 1,3             |
--------------------------------
| 2          | 1,2             |
--------------------------------
| 3          | 1,2,3           |
--------------------------------

现在,我正在查询tableB。类似于以下查询 -

SELECT * FROM tableB

我想使用col2tableA中选择idFromTableA。我知道GROUP_CONCAT,但我无法理解。

如何使用存储在名为col2的{​​{1}}中的id来选择tableB值?我想要展开idFromTableA的值,并希望创建一个子查询以从idFromTableA获取值。 我可以用这个逻辑来实现这个目标吗?

在@ Phil的建议之后,我正在创建另一个表并按如下方式存储数据 - 这样可以吗?

tableA

1 个答案:

答案 0 :(得分:2)

制作联结表以促进多对多关系,例如

CREATE TABLE `tableA_B` (
    a_col1 INT NOT NULL, -- or whatever the data type is for the foreign key
    b_col2 INT NOT NULL,
    PRIMARY KEY (a_col1, b_col1),
    FOREIGN KEY (a_col1) REFERENCES tableA (col1),
    FOREIGN KEY (b_col1) REFERENCES tableB (col1)
) ENGINE=InnoDB;

然后您可以插入相关数据

INSERT INTO tableA_B (a_col1, b_col1) VALUES
(1, 1), (3, 1),
(1, 2), (2, 2),
(1, 3), (2, 3), (3, 3);

然后你可以执行你的选择......

SELECT b.col1, a.col2
FROM tableB b
INNER JOIN tableA_B ab ON b.col1 = ab.b_col1
INNER JOIN tableA a ON ab.a_col1 = a.col1;

或者,从idFromTableA ...

中删除tableB
ALTER TABLE `tableB` DROP COLUMN `idFromTableA`;

您可能希望尝试将逗号分隔值迁移到联结表中,而不是使用上面的INSERT语句。您可能希望使用可编程客户端界面(如PHP + PDO / mysqli)来执行此操作。