Mysql查询看起来不对

时间:2017-09-29 18:02:33

标签: php mysql sql

我想基于另一个表更新我的表中的字段,我在下面执行了这个查询,但我认为这不对..看起来它有效但是它是否正确?有什么情况可能会失败吗?

UPDATE users SET page = (SELECT page_name FROM pages WHERE user_id = id)

我的表USERS有一个列ID和页面。我的表PAGES有一个列page_name和user_id。上面的代码是对的吗?

4 个答案:

答案 0 :(得分:1)

而不是subselect在mysql中你可以使用UPDATE JOIN

  UPDATE users 
  INNER JOIN pages on pages.user_id = users.id
  SET users.page = pages.page_name

答案 1 :(得分:1)

如果每个user_id的页面有多个page_name,则可能会失败。我发现UPDATE a INNER JOIN b ON some_conditions SET a.fieldA = b.fieldB;更具可读性。它确实具有相同的故障情况,并且可能更难以“修复”此类情况;但相关的子查询(您的版本)往往会明显变慢。

另外,样式注释UPDATE users AS u SET u.page = (SELECT p.page_name FROM pages AS p WHERE p.user_id = u.id);将消除对最后两句话的需要(更重要的是):

  • 使得下一个必须查看查询的开发人员不必查看数据库以找出(或记住)哪些字段转到哪些表。
  • 如果以后将id字段添加到pages,则查询不会中断。

答案 2 :(得分:1)

每当查询中有多个表时,应始终使用限定列名 - 最好是别名。因此,您的查询版本将是:

UPDATE users u
     SET page = (SELECT p.page_name FROM pages p WHERE p.user_id = u.id);

接下来,您必须考虑子查询是否可能返回多行。如果是这样,您必须将其限制为一行。有各种方法,SELECT MAX(p.page_name)LIMIT 1SELECT GROUP_CONCAT(p.page_name)都会浮现在脑海中。

接下来,您要更新users中的所有行。如果您只想更新匹配的行,则可以使用IN子句中的EXISTSWHERE继续子查询路径。或者,使用JOIN

UPDATE users u JOIN
       pages p
       ON p.user_id = u.id
     SET u.page = p.page_name;

但最重要的是,问一下存在问题:你为什么需要做这个更新?你有两个表之间的链接。使用链接而不是存储名称:

select u.*, p.page_name
from users u left join
     pages p
     on p.user_id = u.id;

答案 3 :(得分:-1)

您可以使用以下示例SQL并根据您的要求进行更改。上面的代码似乎是正确的。请您粘贴错误

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);