Mysql 与Golang db.query的结果不同,实际运行在db上

Mysql 与Golang db.query的结果不同,实际运行在db上,mysql,go,Mysql,Go,我有一个MySQL数据库,我在上面运行一个查询,根据一些分组标准从每个组中获取最上面的一行: SELECT ranked.id, ranked.os, ranked.version, ranked.timestamp, agent_metadata.* FROM (SELECT *, @os_rank := IF(@current_os = os, @os_rank + 1, 1) AS os_rank, @current_os := os FROM default

我有一个MySQL数据库,我在上面运行一个查询,根据一些分组标准从每个组中获取最上面的一行:

SELECT ranked.id, ranked.os, ranked.version, ranked.timestamp, agent_metadata.*
FROM
  (SELECT *,
     @os_rank := IF(@current_os = os, @os_rank + 1, 1) AS os_rank,
     @current_os := os
   FROM default_version
   ORDER BY os DESC, timestamp DESC
  ) as ranked INNER JOIN agent_metadata ON ranked.os = agent_metadata.os AND ranked.version = agent_metadata.version
WHERE os_rank = 1;
当我使用DataGrip在我的数据库上运行这个查询时,我得到了预期的结果

但是,当我使用db.query从我的Go代码运行相同的查询时,我得到的不是2行,而是5行

我有一些构建查询的逻辑,但在运行查询之前,我会将其打印到日志中:

// ... build query
query := qb.String()

logger.Debugf("Executing: %s", query)

if rows, err := repository.connection.Query(query); err != nil {
    return defaults, errors.Wrap(err, "get default versions")
} else {
    defer rows.Close()
    for rows.Next() {

        result := DefaultVersionExtended{}

        err := rows.Scan(
            &result.Id,
            &result.DefaultVersion.OS,
            &result.DefaultVersion.Version,
            &result.Timestamp,
            &result.AgentMetadata.OS,
            &result.AgentMetadataExtended.Version,
            &result.AgentMetadataExtended.Name,
            &result.AgentMetadataExtended.Description,
            &result.AgentMetadataExtended.ReleaseNotesUrl,
            &result.AgentMetadataExtended.UploadTime)

        if err != nil {
            return defaults, errors.Wrap(err, "get default versions")
        }

        defaults = append(defaults, result)
    }

    err = rows.Err()
    if err != nil {
        return defaults, errors.Wrap(err, "get default versions")
    }

    return defaults, errors.Wrap(err, "get default versions")
}
这是日志的输出:

时间=2017-07-25T15:07:47+03:00级别=调试消息=执行:选择 ranged.id,ranged.os,ranged.version,ranged.timestamp, 代理_元数据。*从SELECT*,@os_排名:=IF@current_os=os, @os_rank+1,1作为os_rank,@current_os:=默认版本的os 按os DESC排序,时间戳DESC作为排序的内部联接代理\u元数据 在ranked.os=agent_metadata.os和ranked.version上= agent\u metadata.version,其中os\u rank=1 class=auroradb.agent\u存储库

如果我将查询从日志复制粘贴到我的DB控制台并运行它,我将得到两行正确的结果:

但是,我的单元测试失败了,因为我希望结果有2行,但实际上有5行:

错误:[{%!sint=1{windows 1.2.3}{{windows 1.2.3我的名字这是 windows测试代理}2017-07-25 12:07:45.099+0000 UTC}2017-07-25 12:07:45.38+0000 UTC}{%!sint=3 {Windows1.2.3.1}{{Windows1.2.3.1我的名字2这是第二次测试 windows代理}2017-07-25 12:07:46.237 +0000 UTC}2017-07-25 12:07:46.519+0000 UTC}{%!sint=4{windows 1.2.3.2}{{windows 1.2.3.2我的名字3这是windows的第二个测试代理}2017-07-25 12:07:46.801+0000 UTC} 2017-07-25 12:07:47.082+0000 UTC{%!sint=2{mac 1.2.3.2.M}{mac 1.2.3.2.M我的名字3.M这是第二个windows测试代理}2017-07-25 12:07:45.662+0000 UTC} 2017-07-25 12:07:45.944+0000 UTC{%!sint=5{mac 1.2.3.5.M}{mac 1.2.3.5.M我的名字3.M这是windows的第二个测试代理}2017-07-25 12:07:47.364+0000 UTC} 2017-07-25 12:07:47.653+0000 UTC}]应该有2项,但有5项

返回的结果实际上是来自agent_元数据的全部数据。这就好像整个逻辑选择了最重要的结果,或者每个小组都不起作用


我正在使用as驱动程序。

您的repository.connection.Queryquery是否只执行一次查询?或者@的行为如何。。。瓦莱布尔斯?Go和DataGrip中的相同吗?是的,只有一次。我的直觉也会责怪@,但我把查询作为字符串传递,所以我不确定它怎么会出错。记录器正确打印字符串。为什么它不能正确地传递给数据库?另一方面,整个else块被不必要地嵌套了。因为您返回了if,所以您甚至不需要else。我需要else,因为它使用if中的行。我同意这有点烦人。您的repository.connection.queryqueryquery是否只执行一次查询?或者@的行为如何。。。瓦莱布尔斯?Go和DataGrip中的相同吗?是的,只有一次。我的直觉也会责怪@,但我把查询作为字符串传递,所以我不确定它怎么会出错。记录器正确打印字符串。为什么它不能正确地传递给数据库?另一方面,整个else块被不必要地嵌套了。因为您返回了if,所以您甚至不需要else。我需要else,因为它使用if中的行。我同意这有点烦人。