我敢肯定这很简单,但是我很难提出正确的update / select语句。

我有一张叫做POSTS的表。该表的POSTID为PK。它的PARENTID当前为NULL。它还具有GROUPID,该GROUPID具有将POST分组在一起的旧数值。

GROUPID的一个示例,如果我有三个帖子组成一个线程,则它们在GROUPID中的值都相同。

我想做的是遍历每条记录,记下POSTID和GROUPID,选择所有具有相同GROUPID的其他记录,并使用我在第一次搜索中记录的POSTID更新其PARENTID。

| POSTID | PARENTID | GROUPID |
| 109    | NULL     | 20      |
| 110    | NULL     | 20      |
| 111    | NULL     | 20      |
| 112    | NULL     | 21      |
| 113    | NULL     | 21      |


我要使其如下:

| POSTID | PARENTID | GROUPID |
| 109    | NULL     | 20      |
| 110    | 109      | 20      |
| 111    | 109      | 20      |
| 112    | NULL     | 21      |
| 113    | 112      | 21      |


我希望这是有道理的。

谢谢!

最佳答案

假设我正确理解了您的问题,则可以使用join聚合表将min表恢复为自身。然后,您可以使用案例来确定最小帖子ID是否是父帖子。

这是执行此操作的一种方法:

select t.postid,
  case when postid <> minpostid then minpostid end parentid,
  t.groupid
from yourtable t
  join (select groupid, min(postid) minpostid
    from yourtable t2
    group by groupid) t2 on t.groupid = t2.groupid



SQL Fiddle Demo




如果要update表中的数据,可以对join使用相同的查询:

update yourtable t
  join (select groupid, min(postid) minpostid
    from yourtable t2
    group by groupid) t2 on t.groupid = t2.groupid
set t.parentid = case when postid <> minpostid then minpostid end;



More Fiddle

关于mysql - 嵌套SQL查询和更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23817241/

10-12 17:59