我在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 ?
答案 0 :(得分:1)
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)