2016-04-21 18 views
0

私は3つの列を持つMySQLテーブルを持っています。最初はユニークキー(INT(11) AUTO_INCREMENT)、次はインデックス値(VARCHAR(255))、3番目は説明(TEXT) 。 2番目の列に重複した値がありますが、各行には異なる説明があります。私は、2番目の列が複製されているすべての行を削除したいが、最初のインスタンスに同じインデックス値の各説明を追加し、セミコロンとスペースで文字列を分割する。PHP MySQLは、他の列が重複している列を連結します

例えば、私のテーブルは次のようになります。私はやってPHPスクリプトを使用する有害じゃない

cid | word | description 
------------------------------ 
1  | cat  | an animal with wiskers; a house pet; a cool person 
3  | dog  | a member of the canine family 

cid | word | description 
------------------------------ 
1  | cat  | an animal with wiskers 
2  | cat  | a house pet 
3  | dog  | a member of the canine family 
4  | cat  | a cool person 

私はこのように見えるようにテーブルを変更したいですこれはMySQLを好むでしょう。このテーブルには17万行以上の行があり、それをループするのにPHPに長い時間がかかります。

+0

MySQL 5.7は不平を言いますどのようにその番号を選んでいるのかについての論理はないので、ここでは 'cid'について説明します。それは最も低い「cid」値ですか?代替ビューでその列を省略できますか? – tadman

答えて

2

SQL:

select `cid`,`word`,group_concat(`description` SEPARATOR '; ') as `description` from `test_table` group by `word`; 

[OK]を..あなたが別のテーブルにすべてのデータをコピーすることができ、そして前に述べたように...そして、

insert into `test_new` (`cid`,`word`,`desc`) (select `cid`,`word`,group_concat(`desc` SEPARATOR '; ') as `description` from `test_table` group by `word`); 

mysql> describe `test_new`; 
+-------+----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+----------+------+-----+---------+-------+ 
| id | int(11) | YES |  | NULL |  | 
| word | char(10) | YES |  | NULL |  | 
| desc | text  | YES |  | NULL |  | 
+-------+----------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

mysql> select * from `test_new`; 
+------+------+---------------------+ 
| id | word | desc    | 
+------+------+---------------------+ 
| 1 | cat | desc1; desc2; desc4 | 
| 3 | dog | desc3    | 
+------+------+---------------------+ 
2 rows in set (0.00 sec) 
+0

そのSQLコードを使用した後、選択した情報で別のテーブルを作成することはできますか? – Webeng

+0

@Webeng、私は答えを更新しました – Wizard

0

を名前を変更し、新しいテーブルを作成することができます情報をコピーするには、2つのステップで行うこともできますが、古いテーブルを変更しても問題がない場合に限ります:

UPDATE tableOld AS N1, tableOld AS N2 
SET N1.description = concat(concat(N1.description,"; "),N2.decription)) 
WHERE N2.word = N1.word 

insert into tableNew (cid,name,description)select * from tableOld group by word 
関連する問題