2012-03-01 10 views
1

MySQL内のデータベーステーブルを更新して行を結合しようとしています。テーブルの内容は次のとおりです。同じテーブル内のGROUP_CONCATでSELECTステートメントを使用してUPDATEを実行する

NID  SID  CID  NO  DATA 
5297 32002 5 0 10 
5297 32002 5 1 17 
5297 32002 5 2 1976 

「DATA」列には、日付を構成する月、日、年が含まれています。だから私は、次のようにこれらのレコードを結合したいと思います:

各SIDに対して
5297 32002 5 0 10-17-1976 

、それが「いいえ」の列と日付の三つの部分を含むで示される3異なる行、とCIDが含まれています。

私は出力がこのselect文で希望取得することができます。

SELECT GROUP_CONCAT(d.data ORDER BY `no` SEPARATOR '-') AS data FROM 
webform_submitted_data_copy d WHERE cid = "5" GROUP BY d.sid 

これは私がどのように形成するかを見つけ出すことはできませんUPDATE..but以下「データ」の欄にあることが望まれているものを返します正しいUPDATE文...のようなもの:

UPDATE webform_submitted_data_copy 
SET webform_submitted_data_copy.data = (GROUP_CONCAT(d.data ORDER BY `no` SEPARATOR '-')) 
WHERE webform_submitted_data_copy.cid = "5" GROUP BY webform_submitted_data_copy.sid 

しかし、これは0行に影響を与え、何の障害を持っていませんが...ない喜びと他の多くの可能なステートメントを試してみました。

???

誰でもこの仕事をするために必要なことを知っていますか?

答えて

0

UPDATEステートメントが本当に必要ないように思えます。 UPDATEを実行すると、以前と同じ数のレコードがテーブルに残ります。それが始まったときの3分の1のレコードで終了するように思えます。 (右?)

私はあなたの最善の策は、一時的なテーブルを作成することだと思う;

CREATE TABLE webform_submitted_data_copy_temp 
SELECT d.nid, d.sid, d.cid, GROUP_CONCAT(d.data ORDER BY `no` SEPARATOR '-') AS data FROM 
webform_submitted_data_copy d WHERE cid = "5" GROUP BY d.sid; 

UPDATE webform_submitted_data_copy 
    SET data = 
     (SELECT data 
      FROM webform_submitted_data_copy_temp 
      WHERE sid = webform_submitted_data_copy.sid 
     ) 
WHERE cid = '5' 
    AND no = 0 
; 

DELETE webform_submitted_data_copy 
WHERE cid = '5' 
    AND no > 0 
; 

DROP TABLE webform_submitted_data_copy_temp; 
+0

実際には、そこにSQLに「TEMPORARY」テーブルを作成する必要があります。 ;) –

+1

@ RyanP:私は実際にはSQLを更新しました。 – ruakh

+0

( 'CREATE ... SELECT'構文で' TEMPORARY'を使用できるかどうかはわかりませんが、明白な理由から、 'DROP'を実行したバージョンで' TEMPORARY'を使いたくないとにかく元のテーブル、新しいバージョンでは、うまくいくでしょう。) – ruakh

関連する問題