当前位置: 首页 > 面试题库 >

MySQL更新语句仅匹配第一行

怀经赋
2023-03-14
问题内容

这是我的桌子:

mysql> select * from t1;
+------+-------+
| id   | value |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id   | value |
+------+-------+
|    1 |     2 |
|    1 |     1 |
|    1 |     2 |
|    1 |     3 |
+------+-------+
4 rows in set (0.00 sec)

然后,出于某种目的,我运行sql更新表t1中的日期:

mysql> update t1 join t2 on t1.id=t2.id  set t1.value=t2.value ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

现在,查看更改:

 mysql> select * from t1;
+------+-------+
| id   | value |
+------+-------+
|    1 |     2 |
+------+-------+
1 row in set (0.00 sec)

我不知道为什么匹配的行数为1,并且很难理解t1的列的值是id =
1而不是3的值2。当它与第一行匹配时,更新停止了吗?我认为在这种情况下,它将在t1和t2之间进行完整的数据匹配。任何帮助表示赞赏!

更新

谢谢,这是我正在认真处理的情况:

对于t2中的值,将它们用’,’分隔,并通过每个id合并到表t1组中的值,但是,t1中值的所有元素都应该是不同的。例如:如上面的表t1和t2所示,更新操作后,t1的值应为:“
1、2、3”,既不是2也不是3。

如果我使用groupconcat()函数,将很难使t1的值与众不同。

再次,我不认为在这种情况下仅在行上进行更新是明智的。如果跨多个表进行更新,则所有与连接条件匹配的行都应循环循环更新。


问题答案:

根据您对问题的更新,您可以这样做

UPDATE t1 JOIN
(
  SELECT id, GROUP_CONCAT(DISTINCT value ORDER BY value) value
    FROM t2
   GROUP BY id
) q
    ON t1.id = q.id
   SET t1.value = q.value

结果:

+ ------ + ------- +
| id | 值|
+ ------ + ------- +
| 1 | 1,2,3 |
+ ------ + ------- +

这是 SQLFiddle 演示

更新:
根据您的评论,这再次改变了您的问题。为了能够t1基于中的值更新定界的值字符串,t2您需要数字表(tally)的帮助来t1.value即时拆分。您可以像这样轻松创建此类表格

CREATE TABLE tally(n INT NOT NULL PRIMARY KEY);

INSERT INTO tally (n)
SELECT a.N + b.N * 10 + 1 n
 FROM 
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n

该脚本会创建一个表,表中的数字从1到100,可以有效分割多达100个定界值。如果您需要更多或更少,则可以轻松调整脚本。

现在更新t1.value,你可以做

UPDATE t1 JOIN
(
  SELECT id, GROUP_CONCAT(value ORDER BY value) value
    FROM
  (
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t1.value, ',', n.n), ',', -1) value
      FROM t1 CROSS JOIN tally n
     WHERE n.n <= 1 + (LENGTH(t1.value) - LENGTH(REPLACE(t1.value, ',', '')))
     UNION
    SELECT id, value
      FROM t2
  ) v
   GROUP BY id
) q
    ON t1.id = q.id
   SET t1.value = q.value

假设你有 t1

| ID | value|
| ---- | ------- |
| 1 | 1,4 |

更新的结果将是

| ID | value|
| ---- | --------- |
| 1 | 1,2,3,4 |

这是 SQLFiddle 演示

从长远来看, 您最好重新考虑数据库模式并规范化数据 。通过允许正常维护和查询数据,这将节省大量时间。



 类似资料:
  • 嗨,当我试图更新一个jdbc表时,只有第一行被更新,下面是它的代码。虽然我对每一行都有一个单独的按钮,但我单击的任何按钮都将输入值作为第一行的值。 为了比较,我使用了下面的条件(for where条件),它也只取第一行值 我使用的更新是

  • 问题内容: 我已经习惯了MSSQL,而不是Mysql,所以对这个可能很愚蠢的问题感到抱歉。我正在尝试通过运行以下查询来更新备份数据库的密码: 当我运行它时,它说 查询正常,受影响的0行(0.01秒)匹配的行:1已更改:0警告:0 为什么行匹配但没有变化? 问题答案: 这意味着该值未更改。由于该列已等于的md5哈希值,因此可能未更改。

  • 问题内容: 如何批量更新mysql数据?如何定义这样的事情: 具有一些值,例如: 和其他值: 也许用mysql是不可能的?一个PHP脚本? 问题答案: 在这种情况下,最简单的解决方案是使用构造。它的工作速度非常快,并且可以轻松完成工作。 或使用建筑

  • 问题内容: 我不知道是什么问题。使用MySQL 5.0尝试运行以下MYSQL更新语句时出现编译错误 所有字段名称都是正确的。有什么想法吗? 问题答案: 尝试这个: 更新: 既然您说查询产生了语法错误,所以我创建了一些可以对其进行测试的表,并确认查询中没有语法错误: 看到?没有语法错误。我针对MySQL 5.5.8进行了测试。

  • 问题内容: 我有2个表格,Products和ShoppingCart,我想根据ShoppingCart中指定的产品名称和数量来更新和减少Products表中产品的“数量”。我怎样才能做到这一点? 表:产品字段:产品名称,产品数量 表:购物车字段:ProductName,ProductQty 访问数据库 问题答案: 您应该有一个产品ID。然而: 您还应该在字段和表名中删除空格。

  • 问题内容: 我正在设法解决一个查询问题,但我只是想不通。如果有人给我一个指针,我将不胜感激。作为我要实现的目标的简单示例,我在数据库中有这些记录 我希望“排名”字段根据得分最高的人包含1,2,3,因此结果应为: 目前,我正在为所有这些记录做一个for next循环,但是鉴于现实情况可能是几千个-可能要花很长时间!有没有人对魔术查询有一个想法,可以一口气做到这一点? 问题答案: 在MySQL中,您可