GROUP BY topic.id 不符合SQL规范
时间: 2023-10-09 13:04:31 浏览: 151
确实,GROUP BY 子句中的列必须是 SELECT 列表中的列或者聚合函数的参数,否则就不符合 SQL 标准。在 MySQL 5.7 以前的版本中,这种情况下 MySQL 会默认使用一个随机的值作为该列的值,但是在 MySQL 5.7 以后的版本中,会抛出一个错误。因此,为了保证查询结果的正确性,应该将 GROUP BY 子句中的列修改为 SELECT 列表中的列或者聚合函数的参数。
以下是修改后的代码:
```
SELECT topic.id, topic.title, topic.subtitle, topic.label,
COUNT(DISTINCT content_info.id) AS contentNum,
COUNT(DISTINCT content_info.union_id) AS peopleNum
FROM topic
LEFT JOIN content_info ON topic.id = content_info.theme_id
WHERE content_info.is_delete = 1
GROUP BY topic.id, topic.title, topic.subtitle, topic.label;
```
这个查询语句中,将 GROUP BY 子句中的列修改为了 SELECT 列表中的列,符合 SQL 标准。
相关问题
优化 SELECT id,title,subtitle,label,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY id) AS contentNum,( SELECT COUNT(*) FROM content_info WHERE theme_id=topic.id AND is_delete=1 GROUP BY union_id) AS peopleNum FROM topic
这个 SQL 查询语句中包含了两个子查询,可能会对查询性能产生一定的影响。可以尝试使用 JOIN 或者子查询优化来提高查询性能。
以下是使用 JOIN 进行优化的示例代码:
```
SELECT topic.id, topic.title, topic.subtitle, topic.label,
COUNT(DISTINCT content_info.id) AS contentNum,
COUNT(DISTINCT content_info.union_id) AS peopleNum
FROM topic
LEFT JOIN content_info ON topic.id = content_info.theme_id
WHERE content_info.is_delete = 1
GROUP BY topic.id;
```
这个查询语句使用了 LEFT JOIN 将 topic 表和 content_info 表连接起来,然后使用 WHERE 子句过滤掉 is_delete 不为 1 的记录。最后使用 GROUP BY 子句对 topic.id 进行分组,使用 COUNT 函数统计 content_info 表中的记录数量。
另外,可以考虑对 topic.id、content_info.id、content_info.union_id 这些字段创建索引,以提高查询性能。
select a.*,count(distinct b.id) as 'topicNum',count(distinct c.id) as 'groupNum' from resource_instance_rocketmq a left join resource_rocketmq_topic b on a.instance_id = b.instance_id left join resource_rocketmq_group c on a.instance_id = c.instance_id where a.instance_name like '%gaotu%' group by a.instance_id order by topicNum asc limit 3 offset 2
以下是将该 SQL 查询语句转换为 Golang 代码的示例:
```go
package main
import (
"context"
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(host:port)/database")
if err != nil {
panic(err.Error())
}
defer db.Close()
query := `
SELECT a.*, COUNT(DISTINCT b.id) AS topicNum, COUNT(DISTINCT c.id) AS groupNum
FROM resource_instance_rocketmq a
LEFT JOIN resource_rocketmq_topic b ON a.instance_id = b.instance_id
LEFT JOIN resource_rocketmq_group c ON a.instance_id = c.instance_id
WHERE a.instance_name LIKE ?
GROUP BY a.instance_id
ORDER BY topicNum ASC
LIMIT 3 OFFSET 2
`
rows, err := db.QueryContext(context.Background(), query, "%gaotu%")
if err != nil {
panic(err.Error())
}
defer rows.Close()
for rows.Next() {
// 读取查询结果,并进行处理
}
}
```
请将代码中的 `user`、`password`、`host`、`port`、`database` 分别替换为您的 MySQL 数据库的实际连接信息。同时,您需要安装 `go-sql-driver/mysql` 包以便 Golang 代码连接 MySQL 数据库。请注意,为了防止 SQL 注入攻击,我们使用了 `?` 占位符,并将查询条件 `"gaotu"` 作为参数传入 `QueryContext` 方法中。
阅读全文