mysql - 更新一个表中的不同行

时间:2017-08-28 03:03:55

标签: mysql

我有这张桌子:

enter image description here

它通过此查询生成SELECT DISTINCT code, tariff_diff FROM mytable

现在,如果tariff_diff出现超过1,我想要更新code = 1。(例如,我想要更新tariff_diff = 1,其中行Kuta,DPS50xxx

我试过了:

update mytable SET tariff_diff = 1 WHERE in(select distinct code, tariff_diff from mytable)

但我得到错误语法。 Operand should contain 1 column

3 个答案:

答案 0 :(得分:1)

如果你想用相同的代码改变所有行,你可以使用它。

UPDATE mytable SET mytable.tariff_diff = 1 WHERE mytable.code IN(SELECT count(*), code, tariff_diff from mytable GROUP BY code HAVING count(*)>1)

答案 1 :(得分:1)

根据我的理解,只有当存在多个以tariff_diff为前缀的行时,您才希望将1设置为Kuta,DPS50.。匹配Kuta,DPS50.06Kuta,DPS50.07Kuta,DPS50.08Kuta,DPS50.09Kuta,DPS50.10

假设您的所有记录都格式为:XXX,xxx.###。您可以使用SUBSTRING_INDEX来解析带前缀的文本(Kuta,DPS50.)以用作标识符。

然后,您可以使用派生的JOIN来匹配具有前缀值重复的代码,并更新匹配的行。 如果没有重复值,则不会进行更新。

示例:http://sqlfiddle.com/#!9/658034/1 (我为Petang,DPS50.02添加了一个附加条目,以证明它适用于其他前缀值。)

<强>查询:

UPDATE mytable AS p
JOIN (
   SELECT SUBSTRING_INDEX(code, '.', 1) AS prefix_code
   FROM mytable
   GROUP BY prefix_code 
   HAVING COUNT(prefix_code) > 1
) AS c
ON c.prefix_code = SUBSTRING_INDEX(p.code, '.', 1)
SET p.tariff_diff = 1;

<强>结果:

|                  code | tariff_diff |
|-----------------------|-------------|
|   Abiansemal,DPS50.02 |           0 |
|         Kuta,DPS50.06 |           1 |
|         Kuta,DPS50.07 |           1 |
|         Kuta,DPS50.08 |           1 |
|         Kuta,DPS50.09 |           1 |
|         Kuta,DPS50.10 |           1 |
| Kuta Selatan,DPS50.05 |           0 |
|  Kuta Ultara,DPS50.04 |           0 |
|       Mengwi,DPS50.01 |           0 |
|       Petang,DPS50.02 |           1 |
|       Petang,DPS50.03 |           1 |

这也将避免SQL错误(1093)https://dev.mysql.com/doc/refman/5.6/en/update.html

  

您无法更新表并从子查询中的同一个表中进行选择。

答案 2 :(得分:1)

在子查询的select语句中无法使用相同的更新表,您可以在此链接中找到原因:Reason for not use same table in sub-query.

尝试以下查询:

SET @r_code = (select code from mytable GROUP BY code having count(code) > 1);

update mytable SET tariff_diff = 1 WHERE code in (@r_code);

您可以在此链接中找到有关变量的更多信息。More about Variables.

首先将id存储到some变量中,然后在查询中更新这些id。