如何使用 mysql 通过 select 查询获取行数

How to get number of rows by select query using mysql

我是 golang 的新手。我想从 MySQL 数据库创建登录验证。 我想要一种方法,如 PHP mysqli_num_rows($res) == 1... 我试过 len(rows)rows.Column() @fmt.Println("No of rows are :", rows) 但它不会... 我试过的代码......(这是一个虚拟代码)

rows, err := db.Query("select * from userLog where u_name = ? and u_pass = ?", uname, pswd)
if err != nil {
    log.Fatal(err)
}
fmt.Println("No of rows are :", rows)
defer rows.Close()

如果您有其他用于登录验证的解决方案,请提出建议并简要说明 请帮助我。

应用程序语言没有区别。使用 count(*):

select count(*) as cnt
from userLog
where u_name = ? and u_pass = ?;

然后读取查询returns.

的值

据我了解,您需要检查数据库中是否存在用户和密码。如果是这样你可以这样做:

var isAuthenticated bool
err := db.QueryRow("SELECT IF(COUNT(*),'true','false') FROM userLog WHERE u_name = ? AND u_pass = ?", uname, pswd).Scan(&isAuthenticated)
if err != nil {
    log.Fatal(err)
} 

如果数据库包含提供的用户和密码,isAuthenticated 将设置为 true。

如果您已经执行了一个查询 db.Query("SELECT * FROM some_tbl") 并且有一个 rows 迭代器,那么如果不遍历它就无法提取行数。如您所见 there nothing that returns the number of rows.

所以你唯一能做的就是查询 select 行数:db.Query("SELECT COUNT(*) FROM some_tbl")

如前所述,count(*) 工作正常,而 Scan 使其更简单,例如:

func GetCount(schemadottablename string) int {
    var cnt int
    _ = db.QueryRow(`select count(*) from ` + schemadottablename).Scan(&cnt)
    return cnt 
}

当然,您可以将其与 where 语句一起使用以 "refine" 计数,例如:

func GetCount(schemadottablename string, column string, value string) int {
    var cnt int
    _ = db.QueryRow(`select count(` + column + `) from ` + schemadottablename + ` where ` + column + `=?`, value).Scan(&cnt)
    return cnt 

}

这是一个相当有效的方法来 return 在 MySQL select 中的行数:

rows, selerr := db.Query(sql, StartDate, EndDate) // Query
if selerr != nil { 
    fmt.Fprint(w, selerr); 
    return 
}
count := 0
for rows.Next() { 
    count += 1 
}

rows, _ := db.Query(sql, StartDate, EndDate) // Query again - no error 

只是为了增加对这个主题的一些见解,您是否想过有一个通用的方法,可以让您将任何 select 语句表达为 select count(*),这可能对分页事务,希望有人在寻找什么:

package main

import (
    "fmt"
    "regexp"
)

const sample = `select a,b,c
from <table>
where <conditions>`

func main() {
    var re = regexp.MustCompile(`(select)\b.[\s\S]*(from[\s\S]*)`)
    s := re.ReplaceAllString(sample, " count(*)\n")
    fmt.Println(sample + "\n")
    fmt.Println(s)
}

https://play.golang.org/p/29Iiv1Ta-0_D