【问题标题】:UPDATE with ORDER BY and LIMIT not working in MYSQL使用 ORDER BY 和 LIMIT 更新在 MYSQL 中不起作用
【发布时间】:2012-01-31 13:35:41
【问题描述】:

我是 MYSQL 新手,无法解决,甚至无法在此论坛上找到这么多答案,无法识别此语句中的错误。我正在使用 MYSQL 数据库。

我有 2 个表:Ratemaster 和 rates,客户可以在其中拥有 1 个具有不同价格的产品。 因此,客户和产品字段存在重复,只有费率字段发生变化。 现在 Table Ratemaster 拥有所有字段:id、客户代码、产品、费率、用户 而 Table Rates 只有:id、cust code、Rate、user。 - user 字段用于检查 session_user。

现在 Table Ratemaster 有 3 条记录,所有字段值都相同,但 Rate 字段为空。 表费率有不同的费率。 我希望在 Ratemaster 中从 Rates 表中更新所有费率。我无法使用UPDATELIMIT mysql 命令执行此操作,它给出的错误为:

错误使用 UPDATE 和 LIMIT

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
LIMIT 1

【问题讨论】:

  • 你的ORDER BY在哪里??? (你的问题用 ORDER BY 说)
  • 嗨,我也尝试过使用 ORDER BY,它给出了同样的错误:错误使用 UPDATE 和 ORDER BY。
  • 然后告诉我们查询 - LIMIT 是无意义的 ORDER BY
  • UPDATE Ratemaster, Rates SET Ratemaster.Rate=Rates.Rate WHERE Ratemaster.user=Rates.user ORDER BY Ratemaster.id DESC LIMIT 1
  • 向我们展示一些数据。哪些行需要更新?他们都是? (我猜不会)。一个用户的所有行?一个用户和一个产品的所有行?

标签: mysql limit


【解决方案1】:

通常您可以在您的UPDATE 语句中使用LIMITORDER,但在您的情况下,如MySQL Documentation 12.2.10. UPDATE Syntax 中所写:

对于多表语法,UPDATE 更新每个名为的表中的行 在满足条件的 table_references 中。在这种情况下,订购 不能使用 BY 和 LIMIT。

尝试以下方法:

UPDATE Ratemaster
SET Ratemaster.Rate =
(
    SELECT Rates.Rate
    FROM Rates
    WHERE Ratemaster.user = Rates.user
    ORDER BY Rates.id
    LIMIT 1
)

【讨论】:

  • 在这种情况下应该做些什么才能使它工作,请帮助解决我的问题。
  • 添加了一个示例查询,但我不知道你到底想做什么。
  • 嗨,上面的 sql 语句有效,但结果是,所有 3 条满足用户=用户的 Ratemaster 的记录只有 Rates 表中的 1 个值,我需要的是 Rates 表中的 3 个不同的值,我认为限制不起作用,希望这一点很清楚。
  • 嗨,Sascha,我的要求很简单,我需要将 Rates 表 (Rate) 的 3 个值复制到 Ratemaster 字段 Rate 中,其中除了 1 个字段 Rate 列之外,所有 3 条记录都是重复的。跨度>
【解决方案2】:

萨拉姆 你可以使用这个方法并且正常工作!

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
ORDER BY Rates.id
LIMIT 1

【讨论】:

    【解决方案3】:

    100% 工作

    UPDATE table  SET Sing='p'  ORDER BY sr_no  LIMIT 10;  
    

    【讨论】:

      【解决方案4】:

      阅读关于 How to use ORDER BY and LIMIT on multi-table updates in MySQL

      对于多表语法,UPDATE 更新每个名为的表中的行 在满足条件的 table_references 中。在这种情况下,订购 不能使用 BY 和 LIMIT。

      【讨论】:

      • 大声笑,刚刚读了那篇文章,我当时就震惊了。这家伙描述了一个项目,这似乎正是我正在做的项目;)
      【解决方案5】:

      问题在于 LIMIT 只能与 SELECT 语句一起使用,因为它限制了查询返回的行数。

      发件人:http://dev.mysql.com/doc/refman/5.5/en/select.html

      LIMIT 子句可用于限制返回的行数 SELECT 语句。 LIMIT 接受一个或两个数字参数,其中 必须都是非负整数常量,但有以下例外:

      Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.
      
      Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables as of MySQL 5.5.6.
      

      有两个参数,第一个参数指定的偏移量 第一行返回,第二行指定最大数量 要返回的行。初始行的偏移量为0(不是1):

      SELECT * FROM tbl LIMIT 5,10; # 检索第 6-15 行

      检索从某个偏移量到结果末尾的所有行 设置,您可以为第二个参数使用一些较大的数字。这 语句检索从第 96 行到最后一行的所有行:

      SELECT * FROM tbl LIMIT 95,18446744073709551615;

      使用一个参数,该值指定要返回的行数 从结果集的开头:

      SELECT * FROM tbl LIMIT 5; # 检索前 5 行

      换句话说,LIMIT row_count 等价于 LIMIT 0, row_count。

      对于准备好的语句,您可以使用占位符。以下 语句将从 tbl 表中返回一行:

      SET @a=1;准备 STMT FROM 'SELECT * FROM tbl LIMIT ?';执行STMT 使用@a;

      以下语句将返回从第 2 行到第 6 行 tbl 表:

      SET @skip=1;设置@numrows=5; PREPARE STMT FROM 'SELECT * FROM tbl 限制 ?, ?';使用@skip、@numrows 执行STMT;

      为了兼容 PostgreSQL,MySQL 还支持 LIMIT row_count OFFSET 偏移量语法。

      如果 LIMIT 出现在子查询中并且也应用于外部 查询,最外面的 LIMIT 优先。例如, 以下语句产生两行,而不是一行:

      (选择 ... 限制 1) 限制 2;

      【讨论】:

      • 嗨,我只需要从表 B 字段 1 和表 A 字段 2 进行更新,其中所有记录对于一个用户都是重复的,需要您的帮助来解决这种情况,没有限制,UPDATE 命令更新所有具有相同值的记录
      • @user1114409:您指定的查询将简单地执行您告诉它的操作(即 SET 的内容),用于匹配 WHERE 子句的所有字段。你的桌子的布局是什么?也许 Ratemaster.user=Rates.user 比你想象的更频繁地解析为 true。
      • 嗨 Karolos,是的,你是对的,where 子句是我需要限制的,因此它只更新匹配条件的记录。在上面的问题中我已经明确给出了表格的布局,很简单。检查第二段是否相同。
      • @user1114409:也许对你来说很简单,但在你解释之后,我似乎不明白你想要什么。您说“我需要将 Rates 表(Rate)的 3 个值复制到 Ratemaster 字段 Rate 中,其中所有 3 条记录都是重复的,除了其中的 1 个字段 Rate 列”;您能否以一些虚拟行为例来更新您的帖子?您如何期望来自 ratemaster 的三个 duplicate records 填充来自 table rates 的三个 不同 (?) 速率?数据库应该如何知道表 rate 中的 3 个值中的哪一个对应于那些来自 ratemaster 的值?对不起,我想不通
      • 限制也可以与“更新”一起使用:dev.mysql.com/doc/refman/5.0/en/update.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多