Go 客户端的选择查询中的 SQL 变量未更新

我正在 SQL 中运行以下查询。


SET @thisid=0;

SET @serial=0;


SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;

仅当新 id 与上一个 id 不同时,变量 @serial 基本上才会递增。在终端中运行这些查询并打印 @serial 和 @thisid 的值时,收到的值是 @thisid='id6' @serial=6。


我在我的 go 代码中执行了这个查询:


if _, err = repo.db.ExecContext(ctx, "SET @thisid=0;"); err != nil {

    return

}


if _, err = repo.db.ExecContext(ctx, "SET @serial=0;"); err != nil {

    return

}


rows, err = repo.db.QueryContext(ctx, fmt.Sprintf(

    "SELECT @serial := IF((@thisid != `places`.`id`), @serial + 1, @serial) as `serial`, @thisid := `places`.`id`, `places`.`id` FROM `places`;",

))

if err != nil {

    fmt.Println("error here")

    return

}


if err = repo.db.QueryRow("SELECT @serial").Scan(&that); err != nil {

    return

}


if err = repo.db.QueryRow("SELECT @thisid").Scan(&this); err != nil {

    return

}

打印@thisid和@serial的值时,@thisid的值与@serial的值接收为0相同。它似乎没有动态更新。


慕娘9325324
浏览 130回答 2
2回答

www说

Go 使用连接池,这意味着每个查询可能发生在不同的连接上。类似的变量的作用域是连接。如果您需要它们在查询之间持续存在,则需要使用事务来确保保持在同一连接内。

慕慕森

你的查询真的很随意。MySQL 不保证select. 它也不保证结果集的顺序。所以,我想你想要:select p.*,       (@rn := if(@id = id, @rn + 1,                  if(@id := id, 1, 1)                 )       ) as serialfrom (select p.*      from places p      order by p.id     ) p cross join     (select @id := 0, @rn := 0) params;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go