2016-10-04 11 views
0

フォーラムの更新後、私は空白のフィールドが残っているはずです。 私はthreadという名前のテーブルを、postという名前のテーブルのフィールドで更新しようとしています。私はthreadid、postidで注文されたポストテーブルを処理する必要があります。私がしようMYSQL 1つのテーブルをステップして別のテーブルを更新する

Table: post 
Field: postid - data is valid 
Field: threadid - data is valid 

Table: thread 
Field: threadid - data is valid and matches post.threadid 
Field: firstpostid - should be first post.postid found 
Field: lastpostid - should be last post.postid found 
Field: lastpost - should be last post.postid found 

すべてがfirstpostidに同じ値を得て、私は一度に一つのフィールドを更新する方法を確立しようとしてしまったので、これは程度の近い

lastpostidされます。注文を正しく設定できません。

UPDATE thread 
INNER JOIN post ON post.threadid = thread.threadid 
SET thread.firstpostid = 
IF(thread.firstpostid > post.postid, post.postid, thread.firstpostid) 
WHERE postid <> 0 

すべてのポインタが優れています。ありがとう

答えて

0

相関サブクエリを使用できますが、これは最も効率の悪いアプローチです。合理的なパフォーマンスを得るために、我々は間違いなく例えば利用できる適切なインデックスを持つようにしたい:

... ON post (thread_id, post_id) 

(その順序で有数の列、などthread_idpost_idとの任意のインデックスが)我々は、スカラー副問合せを使用することができます各列に割り当てられる値post_idを取得します。 (この文脈では、サブクエリは、スカラーでなければならない:クエリが単一の値を含む最大1つの行を返す必要があります。

UPDATE thread t 
    SET t.firstpostid = 
     (SELECT p1.post_id 
      FROM post p1 
      WHERE p1.thread_id = t.thread_id 
      ORDER BY p1.thread_id, p1.post_id 
      LIMIT 0,1 
     ) 
     , t.secondpostid = 
     (SELECT p2.post_id 
      FROM post p2 
      WHERE p2.thread_id = t.thread_id 
      ORDER BY p2.thread_id, p2.post_id 
      LIMIT 1,1 
     ) 
     , t.lastpostid = 
     (SELECT p9.post_id 
      FROM post p9 
      WHERE p9.thread_id = t.thread_id 
      ORDER BY p9.thread_id DESC, p9.post_id DESC 
      LIMIT 0,1 
     ) 

を「トリック」は、ORDER BYの後に適用されるLIMIT句である

LIMIT 0,1が0行をスキップして返すと言い、次の1行 LIMIT 1,1たちは、ソート(DESC =降順、対デフォルトの順序を逆に、1行をスキップし、最後にpost_idを取得するには、次の1行

を返すと言いますASC =昇順)。

+0

私はあなたの助けに感謝しますが、私はまだ苦労しています。関係するテーブルは、5300のポストと333のスレッドが小さいので、単純な非効率的なコードを使って作業をしても構いません。パスごとに1つのフィールドを設定するには、テーブルを何度かステップ実行することが非常にうれしいです。インデックスを使う場所や命令で注文する場所を知っていれば、それを管理できると思います。 – Chris

+0

理想的には、注文threadid、postidを使用して一度に1つのレコードをポストテーブルにステップインし、テーブルスレッドに書き込む必要があります。それは可能ですか? – Chris

+0

行を個別に処理することは可能です(行を苦労させる行)。それは多くの新生児が取るアプローチです。そのアプローチは理想的ではありません。なぜなら、大規模なセットでは、非常に遅く、非常にリソース集約的であることが判明しているからです。これは必然的に「私の小さなテストセットで動いたときに、なぜ私の生産量がこれほど遅いのですか」につながります。データの「セット」を操作する方が効率的です。 – spencer7593

関連する問題