2016-10-04 62 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

相关问题