如何使用 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)
}
我是 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)
}