mysql - 在 Go 中访问 MySQL 查询结果的第二行

标签 mysql sql go

我正在 Go 中运行 MySQL 查询。我想访问查询结果的第二行。我知道我可以使用

for rows.Next {

}

但我不想运行一个循环来访问第二行(然后在它第二次迭代后中断循环)。 该怎么办?

这是一个代码片段:

rows,err:= db.Query("SELECT status,ts FROM events WHERE node = ? order by ts desc limit 2", testNode.ID);
defer rows.Close()
if ( err!= nil){
    t.Error("Some Error" + err.Error())
}
isNext:=rows.Next()
if(isNext == false) {
    t.Error(" No rows in query result")
}
rows.Scan(&status)
// What to do to use second row ?

最佳答案

坚持DB.Query()

如果您要丢弃第一行,则没有必要从数据库中检索它。

使用 LIMIT 1, 1 丢弃第一个结果并将结果限制为 1 行(查看 LIMIT 的文档:MySQL SELECT syntax)。然后继续阅读第一行,这将是查询结果的第二行:

q := "SELECT status, ts FROM events WHERE node = ? order by ts desc limit 1, 1"
rows, err := db.Query(query, testNode.ID);
if err != nil {
    t.Error("Error:", err)
    return
}
defer rows.Close()

if !rows.Next() {
    t.Error("No result")
    return
}
if err := rows.Scan(&status); err != nil {
    t.Error("Failed to scan:", err)
    return
}

// All good, use status
fmt.Println("Status:", status)

更多使用 LIMIT 的例子:

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

使用DB.QueryRow()

如果您期望最多 1 行,您也可以使用 DB.QueryRow(),结果会更紧凑:

q := "SELECT status, ts FROM events WHERE node = ? order by ts desc limit 1, 1"
if err := db.QueryRow(query, testNode.ID).Scan(&status); err != nil {
    t.Error("Failed to scan, no result?")
    return
}

// All good, use status
fmt.Println("Status:", status)

关于mysql - 在 Go 中访问 MySQL 查询结果的第二行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997341/

相关文章:

go - 如何在函数中返回不同类型(golang)

for-loop - 为什么不执行延迟功能?

mysql - 使用 MySQL 中同一个表的 COUNT 连接两个查询

php - 递归函数查找MySQL表的所有依赖项

.net - ORACLE SDO_GEOMETRY ToString()?

git - 为 Git fork 更新 go Assets 路径

php - 用数组填充 HTML 表并创建链接

php - 如何从 mysql url 中提取文件夹名称并删除它及其所有内容?

php - 使用 ExpressionEngine 并收到此错误 : A Database Error Occurred, 错误号 : 1117, 列太多

SQL查询字符串中的回车符并最终删除回车符