17

別のテーブルへの外部キーであるコンマ区切りリストを含む列を持つ正規化されていないテーブルがあります。

+----------+-------------+   +--------------+-------+
| part_id  | material    |   | material_id  | name  |
+----------+-------------+   +--------------+-------+
|      339 | 1.2mm;1.6mm |   |            1 | 1.2mm |
|      970 | 1.6mm       |   |            2 | 1.6mm |
+----------+-------------+   +--------------+-------+

このデータを、手続き型言語を提供しない検索エンジンに読み込みたいと考えています。

この列を結合する、このデータに対してクエリを実行して適切なエントリを新しいテーブルに挿入する方法はありますか? 結果のデータは次のようになります。

+---------+-------------+
| part_id | material_id |
+---------+-------------+
|     339 |           1 |
|     339 |           2 |
|     970 |           2 |
+---------+-------------+

DBMS がテーブルを返す関数をサポートしているが、MySQL はサポートしていないように見える場合、解決策を考えることができます。

4

4 に答える 4

14

MySQLでは、これは以下のように達成できます

SELECT id, length FROM vehicles WHERE id IN ( 117, 148, 126) 

+---------------+
| id  | length  |
+---------------+
| 117 | 25      |
| 126 | 8       |
| 148 | 10      |
+---------------+

SELECT id,vehicle_ids FROM load_plan_configs WHERE load_plan_configs.id =42

+---------------------+
| id  | vehicle_ids   |
+---------------------+
| 42  | 117, 148, 126 |
+---------------------+

コンマ区切りの vehicle_ids の長さを取得するには、以下のクエリを使用します

Output

SELECT length 
FROM   vehicles, load_plan_configs   
WHERE  load_plan_configs.id = 42 AND FIND_IN_SET(
       vehicles.id, load_plan_configs.vehicle_ids
)

+---------+
| length  |
+---------+
| 25      |
| 8       |
| 10      |
+---------+

詳細については、http://amitbrothers.blogspot.in/2014/03/mysql-split-comma-separated-list-into.html をご覧ください。

于 2014-03-13T10:13:54.570 に答える
5

私は同じような質問に2つ答えましたが、何日も回答がありませんでした.

あなたが述べたように、MySQLはテーブルの戻り値の型をまだサポートしていないので、テーブルをループして材料のcsv文字列を解析し、部品と材料の適切な行を生成する以外にほとんどオプションはありません.

次の投稿は興味深いかもしれません。

post php mysqlの分割キーワード

ステージング テーブルから他のテーブルにデータをロードする MySQL プロシージャ。プロセスで複数値フィールドを分割する必要がある

Rgds

于 2010-10-14T18:22:28.347 に答える
0

REGEXP を使用することもできます

SET @materialids=SELECT material FROM parttable where part_id=1;
SELECT * FROM material_id WHERE REGEXP CONCAT('^',@materialids,'$');

これは、1 つのパーツだけを取得する場合に役立ちます。もちろん、テーブル全体ではありません

于 2011-07-27T13:50:40.043 に答える