【问题标题】:How to set the column values of some rows the same as the some other ones in the same table?如何将某些行的列值设置为与同一张表中的其他一些行相同?
【发布时间】:2017-05-08 15:31:31
【问题描述】:

表架构:

+----------------------+---------------+------+-----+---------+-------+
| Field                | Type          | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| name                 | varchar(10)   | YES  | MUL | NULL    |       |
| slno                 | varchar(20)   | YES  |     | NULL    |       |
| type                 | int(2)        | YES  |     | NULL    |       |
| details              | text          | YES  |     | NULL    |       |
+----------------------+---------------+------+-----+---------+-------+

name、slno 和 type 一起构成一个键。

样本数据:

+---------+------+------+-------------------------------+
| name    | slno | type | details                       |
+---------+------+------+-------------------------------+
| name1   | 11   |    1 | {"data":["feats1","feats2"] } |
| name1   | 11   |    2 | {"data":["feats1","feats2"] } |
| name1   | 12   |    1 | {"data":["feats5","feats6"] } |
| name1   | 12   |    2 | {"data":["feats5","feats6"] } |
| name2   | 11   |    1 | {"data":["feats3","feats4"] } |
| name2   | 11   |    2 | {"data":["feats3","feats4"] } |
| name2   | 12   |    1 | {"data":["feats7","feats8"] } |
| name2   | 12   |    2 | {"data":["feats10"] }         |
+---------+------+------+-------------------------------+

因此,基本上对于名称 = 'name1' 的每个条目,都有一个类似的条目具有相同的 slno 但名称 = 'name2'。
我想要做的是将具有相同 slno 和类型但名称不同的行的详细信息设置为相同,即上面的示例数据集应该如下所示。 name2 行的详细信息应与 name1 行的详细信息匹配(如果它们具有相同的 slno 和类型)。

+---------+------+------+-------------------------------+
| name    | slno | type | details                       |
+---------+------+------+-------------------------------+
| name1   | 11   |    1 | {"data":["feats1","feats2"] } |
| name1   | 11   |    2 | {"data":["feats1","feats2"] } |
| name1   | 12   |    1 | {"data":["feats5","feats6"] } |
| name1   | 12   |    2 | {"data":["feats5","feats6"] } |
| name2   | 11   |    1 | {"data":["feats1","feats2"] } |
| name2   | 11   |    2 | {"data":["feats1","feats2"] } |
| name2   | 12   |    1 | {"data":["feats5","feats6"] } |
| name2   | 12   |    2 | {"data":["feats5","feats6"] } |
+---------+------+------+-------------------------------+

我试过了,但想不出一个命令来执行上述结果。有人可以帮忙吗?

【问题讨论】:

  • 那么 slno 和 details 应该形成一个单独的表吗?
  • 不,我给出了示例数据(第二个表)以及它应该如何在它下面进行转换(最后一个表)
  • 您如何为给定的slno / type 夫妇选择参考值?我的意思是,你为什么选择name1 的值而不是name2 的值?
  • 这是我的要求 - 将 name1 的详细信息分配给对应的 name2 的详细信息

标签: mysql sql


【解决方案1】:

如果要求为 name2 详细信息提供 name1 详细信息中的值,您可以在 MySQL 中使用基于 join 的更新来执行此操作

update  yourTable as t1
join    yourTable as t2
on      t1.slno = t2.slno and
        t1.type = t2.type
set     t2.details = t1.details
where   t2.name = 'name2' and
        t1.name = 'name1'

您也可以将我在where 子句中的条件移动到join 条件中实现同样的目的

update  yourTable as t1
join    yourTable as t2
on      t1.slno = t2.slno and
        t1.type = t2.type and
        t2.name = 'name2' and
        t1.name = 'name1'
set     t2.details = t1.details

您可以看到这两个查询的运行情况here

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2015-08-12
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多