2016-07-13 14 views
3
ID | PID | NAME | VALUE | 
------------------------------------- 
    60 | 1 | Test1 | 9999 | 
    21 | 2 | Test2 | 9999 | 
    44 | 1 | Test3 | 9999 | 
    37 | 4 | Test4 | 9999 | 
    24 | 1 | Test5 | 9999 | 

ちょっと! 私はPHPとDBの新機能を使用しています。 IDが多すぎるDB内でソートを行いたいと思っています。 (最初のIDは34で始まり、次は43などが55など)古い列に応じて新しいmySQL dbテーブルの列に値を追加

私は上記のような表を持っています。

今私がしたいのは、PIDにある値に応じてVALUE列の値を変更することです。

これは等次いで2003 PIDの値が1に等しい場合、PID = 2、値2002、その後2001年に変更する必要がある場合、同じ行の値は1001と、次のいずれかの1002次1003 になるべきであることを意味 これは既存のテーブルのためのものですが、そのテーブルに新しいステートメントを追加するたびにVALUE値を追加したいと思います。 だから、擬似コードで簡単なチェック:PIDは1 に等しい場合

それ+1作る 「1」から始まる最高数の値の欄をチェックして、その行の列

にそれを追加するだけですそれはできますか? あなたの代わりに(私は物事を簡単にするために)私に何を勧めますか? さらに詳しい情報が必要な場合は、私に教えてください。私は自分の説明に私が何をしようとしているのか分かりません。

ありがとうございます。

乾杯、 K.

+0

データベースクエリにMySQLiまたはPDOを使用していますか?あなたはすでに何をしようとしましたか? – BeetleJuice

+0

これはsqlのためにあまりにもコンパイルされているので、 "PID等価"ロジックを処理するプログラムを書くか、mysqlのプロシージャを使用する – panda

答えて

1

あなたはUPDATE .. JOINを使用し、各IDの「ランク」を含む派生テーブルに参加し、それに応じて更新することができます。

UPDATE YourTable t 
JOIN(SELECT s.ID,s.PID,COUNT(*) as cnt 
    FROM YourTable s 
    JOIN YourTable s2 
     ON(s.pid = s2.pid AND s.id >= s2.id)) p 
ON(t.id = p.id)   
SET t.value = (1000*t.pid) + p.cnt 

ここで、内側のクエリ基本的に「ランク"自己結合によるデータ。それは条件s.pid = s2.pid AND s.id >= s2.idによって自分自身に参加します - 同じPID私は私を含めて私の前に起こるので、最初のレコードは1レコードに、2レコードは2レコードに...続きを読むvalue列をpid*1000に更新します。プラスランク。

+0

この動作の仕方についての説明:-) – BeetleJuice

+0

@BeetleJuice – sagi

+0

SQLは私よりもはるかに強力です。したがって、 'p'テーブルでは' cnt'は現在のレコードが結合されたレコードの数になります。言い換えれば、5つのレコードが「PID = 1」を有する場合、最も高い「id」を有するレコードの間のレコードは、「cnt = 5」、次の「cnt = 4」...となる。 – BeetleJuice

関連する問題