嵌套SQL查询和更新

时间:2014-05-22 21:19:47

标签: mysql sql

我确信这很简单,但我很难找到正确的更新/选择声明。

我有一张叫做POSTS的桌子。该表有POSTID,即PK。它有PARENTID,它目前都是NULL。它还具有GROUPID,其具有将POSTS组合在一起的传统数值。

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

我要做的是循环遍历每条记录,记下POSTID和GROUPID,选择具有相同GROUPID的所有其他记录,并使用我在第一次搜索时记下的POSTID更新它们的PARENTID。 / p>

| 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      |

我希望这是有道理的。

谢谢!

1 个答案:

答案 0 :(得分:2)

假设我正确理解了您的问题,您可以join使用min聚合回复自己的表格。然后,您可以使用大小写来确定min post 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

如果您想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;