mysql选择位置(逗号分隔)

suzh9iv8  于 2023-02-07  发布在  Mysql
关注(0)|答案(2)|浏览(208)

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;
但不返回任何结果...
有什么想法如何解决?或者更好地创建另一个表,在那里“连接”两个表(“规范化数据”)?

k4emjkb1

k4emjkb11#

您可以使用withjson_table将逗号分隔的字符串转换为行:

with t1 as (
   select Id1, CommaSeparated
       from table01
    )
    select t2.SomeValue
    from t1
    join json_table(
      replace(json_array(t1.CommaSeparated), ',', '","'),
      '$[*]' columns (CommaSeparated varchar(50) path '$')
    ) t
    join table02 t2 on t2.Id2 = t.CommaSeparated
    where t1.Id1 = 3

Demo here

mnowg1ta

mnowg1ta2#

解决方案,使用“链接”表。
LinkingTable

| Id | Id1 | Id2 |
| 1  | 3   | 7   |
| 2  | 3   | 8   |

Table01

| Id1 | CommaSeparated |
| 1   | 1,2,3          |
| 2   | 4              |
| 3   | 7,8            |

Table02

| Id2 | SomeValue   |
| 1   | Value01     |
| 7   | Value02     |
| 8   | Value03     |

和SQL,比如SELECT SomeValue FROM Table02 WHERE Id2 IN( SELECT Id2 FROM LinkingTable WHERE Id1 = 3 );
只需更改代码,在插入Table02时,还需要插入LinkingTable并从Table01使用/获取Id1
或者在我的例子中,我无论如何都需要从Table01中选择数据,所以另一个解决方案,例如,结果名称为。
然后

SELECT SomeValue FROM Table02 WHERE Id2 IN( 
rtrim( str_repeat( '?,', count(explode( ',', trim($arr_result[0]['CommaSeparated ']) )) ), ',' ). 
')';

如果我使用LinkingTable,我也会得到“资源浪费”。因为在LinkingTable中需要插入修改后的lastInsertId来自Table02Id来自Table01
第三个解决方案(有点“疯狂”)。

$sql_select = '
SELECT ( SELECT IFNULL ( 
( SELECT `T02`.`SomeValue` 
FROM Table01 `T01` 
INNER JOIN Table02 `T02` 
ON FIND_IN_SET( `T02`.`Id2`, `T01`.`CommaSeparated` ) 
WHERE `T01`.`Id1 ` = 3 AND <another condition>
)
, "empty first value" ) ) 

UNION 

SELECT ( SELECT IFNULL ( 
( SELECT `T02`.`SomeValue` 
FROM Table01 `T01` 
INNER JOIN Table02 `T02` 
ON FIND_IN_SET( `T02`.`Id2`, `T01`.`CommaSeparated` ) 
WHERE `T01`.`Id1 ` = 3 AND <another condition>
)
, "empty second value" ) ) 
;';

$arr_select = $stmt_select->fetchAll(PDO::FETCH_COLUMN, 0);
获取一维数组。如果知道最大值数(多少个值,那么多个union),可以使用。
目前的结论是LinkingTable解决方案会更好(得到意想不到的东西的可能性更小,是的,似乎总体上使用更少的系统资源)...

相关问题