Table01
(带色谱柱)
| Id1 | CommaSeparated |
| 1 | 1,2,3 |
| 2 | 4 |
| 3 | 7,8 |
Table02
(带列)
| Id2 | SomeValue |
| 1 | Value01 |
| 7 | Value02 |
| 8 | Value03 |
这是可行的:SELECT SomeValue FROM Table02 WHERE Id2 IN(7,8);
。获取值02和值03。
但是SELECT SomeValue FROM Table02 WHERE Id2 IN( SELECT CommaSeparated FROM Table01 WHERE Id1 = ? );
不起作用(只得到Value 02),因为它只接受7,8
的第一个字符/整数。
试过这个SELECT SomeValue FROM Table02 WHERE FIND_IN_SET ( Id2, ( SELECT CommaSeparated FROM Table01 WHERE Id1 = 3 ) ) > 0;
但不返回任何结果...
有什么想法如何解决?或者更好地创建另一个表,在那里“连接”两个表(“规范化数据”)?
2条答案
按热度按时间k4emjkb11#
您可以使用
with
和json_table
将逗号分隔的字符串转换为行:Demo here
mnowg1ta2#
解决方案,使用“链接”表。
LinkingTable
Table01
Table02
和SQL,比如
SELECT SomeValue FROM Table02 WHERE Id2 IN( SELECT Id2 FROM LinkingTable WHERE Id1 = 3 );
只需更改代码,在插入
Table02
时,还需要插入LinkingTable
并从Table01
使用/获取Id1
或者在我的例子中,我无论如何都需要从
Table01
中选择数据,所以另一个解决方案,例如,结果名称为。然后
如果我使用
LinkingTable
,我也会得到“资源浪费”。因为在LinkingTable
中需要插入修改后的lastInsertId
来自Table02
和Id
来自Table01
。第三个解决方案(有点“疯狂”)。
和
$arr_select = $stmt_select->fetchAll(PDO::FETCH_COLUMN, 0);
获取一维数组。如果知道最大值数(多少个值,那么多个
union
),可以使用。目前的结论是
LinkingTable
解决方案会更好(得到意想不到的东西的可能性更小,是的,似乎总体上使用更少的系统资源)...