2016-10-04 76 views
0

在論壇更新之後,我留下了應該填滿的空白字段。 我想用名爲post的表中的字段更新一個名爲thread的表。我需要處理由threadid,postid排序的發佈表。MYSQL通過一個表格步驟並更新另一個

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值。 (在這種情況下,子查詢必須是標量:查詢必須返回一個包含單個值至多一行:

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表示跳過1行,並返回下一個1行

得到最後POST_ID,我們顛倒排序(DESC =下降,對默認的順序ASC =遞增)。

+0

我很感激你的幫助,但我仍在掙扎。有關表格是5300個帖子和333個線程,所以我不介意使用簡單低效的代碼來獲得這份工作。我會非常高興地通過幾次表格來設置每場傳球。如果我知道在哪裏使用索引或按指令順序,我認爲我可以管理。 – Chris

+0

理想情況下,我需要使用訂單threadid,postid並寫入表格線程,一次在帖子表中創建一條記錄。那可能嗎? – Chris

+0

可以單獨處理行RBAR(通過激動行來行)。這是很多新手所採取的方法。這種方法並不理想,因爲它在大型設備上顯得非常慢並且資源密集程度過高。這不可避免地導致了「爲什麼我的產量這麼慢,當它在我的小測試集上工作時」。對「數據集」進行操作會更有效率。 – spencer7593

相關問題