关联查询、分组、if条件

基本

select * from A left/right/inner join B on A.aid = B.bid//没有where条件限制

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

心得:左、右连接都是以各自的边为基准,左表(右表)的数据全部显示出来,然后右表(左表)数据中不足的地方用null补齐。内连接则不以谁为准,只是返回符合条件的数据。当然,如果后面有where条件的限制则以where后面为准。

涉及分组(group by)

select a.mobile,COUNT(b.id) as ff from user a left JOIN space_post b on a.id = b.id_user GROUP BY a.id HAVING ff > 0//分组后对聚合函数得出的结果再次筛选
  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
SELECT b.name as '班级名字',count(sex = 1 or NULL) as 'man',count(sex = 2 or null) as 'woman' from a LEFT JOIN b on a.classid = b.classid GROUP BY b.name//分组后对同一列中的不同情况分开计数

心得:一般情况下,group by会和聚合函数一起使用。

if条件的用法

IF( expr1 , expr2 , expr3 )//条件表达式
  • expr1 的值为 TRUE,则返回值为 expr2 
  • expr2 的值为FALSE,则返回值为 expr3
//新增数据时,使得某一字段自增(如下为不同空间的发帖数的自增)
INSERT INTO space_post (id_user,id_space,content,number,dt_create)
VALUES
(1,1,'aaa',
IF(
(SELECT sp.number FROM space_post sp WHERE sp.id_user = 1 AND sp.id_space = 1 ORDER BY sp.number DESC LIMIT 1),
(SELECT sp1.number FROM space_post sp1 WHERE sp1.id_user = 1 AND sp1.id_space = 1 ORDER BY sp1.number DESC LIMIT 1),0
) + 1,
NOW());
//上方sql语句,if部分的简化
INSERT INTO space_post (id_user,id_space,ids_image,content,number,dt_create)
VALUES
(
$id_user,$id_space,'$ids_image','$content', IF((SELECT @num := sp.number FROM space_post sp WHERE sp.id_space = $id_space ORDER BY sp.number DESC LIMIT 1),@num,0) + 1,
NOW());

心得:简化的sql中使用了自定义变量的赋值:=(用于传递外部参数为语句中变量赋值),自定义变量的使用@

转载于:https://www.cnblogs.com/chuan2005/p/8358621.html

在 Entgo 中进行多关联查询可以使用 `Query` 方法和 `Join` 方法。`Query` 方法用于指定要查询的,而 `Join` 方法用于指定要关联的和关联条件。 例如,我们有三个 `users`、`posts` 和 `comments`,它们的关系是:一个用户可以发多篇文章,一篇文章可以有多个评论。我们想要查询某个用户发的所有文章及每篇文章的评论数,可以使用以下代码: ```go import ( "context" "entgo.io/ent/dialect" "entgo.io/ent/dialect/sql" "entgo.io/ent/entc" "entgo.io/ent/entc/gen" "entgo.io/ent" "entgo.io/ent/entc/load" "entgo.io/ent/schema" ) // 定义用户、文章、评论实体 type User struct { ent.Schema } type Post struct { ent.Schema } type Comment struct { ent.Schema } // 生成实体代码 func main() { cfg := entc.LoadConfig("./ent/schema") cfg.Target = &gen.Config{ Header: "// Code generated by entc, DO NOT EDIT.", Templates: []*gen.Template{ gen.MustParse(gen.NewTemplate("hook/custom.tmpl")), }, } // 配置多关联查询 cfg.Schema.Packages["schema"].Hooks = []gen.Hook{ entc.FuncHook((*sql.Selector)(nil), entc.HookConfig{ On: entc.OnQuery, Func: ` func (s *Selector) WithCommentsCount() *Selector { return s.Select( "posts.*", sql.As(sql.Count("comments.id"), "comments_count"), ). LeftJoin("posts_comments"). On(s.C("id"), ent.OpEq, sql.Ref("posts_comments", "post_id")). LeftJoin("comments"). On(sql.Ref("posts_comments", "comment_id"), ent.OpEq, sql.Ref("comments", "id")). GroupBy("posts.id") } `, }), } entc.Generate(context.Background(), &cfg) } // 查询某个用户发的所有文章及每篇文章的评论数 func queryPostsAndCommentsCount(client *ent.Client, userID int) ([]*ent.Post, error) { user, err := client.User.Get(context.Background(), userID) if err != nil { return nil, err } posts, err := user.QueryPosts().WithCommentsCount().All(context.Background()) if err != nil { return nil, err } return posts, nil } ``` 在上面的例子中,我们定义了三个实体 `User`、`Post` 和 `Comment`,然后在 `main` 函数中配置了多关联查询的 hook。在 hook 中,我们使用 `WithCommentsCount` 方法实现了查询某个用户发的所有文章及每篇文章的评论数的逻辑。具体来说,我们先使用 `Select` 方法指定要查询的字段,其中 `posts.*` 示查询 `posts` 的所有字段,`sql.As(sql.Count("comments.id"), "comments_count")` 示查询 `comments` 中每篇文章的评论数,并将其重命名为 `comments_count`。然后我们使用 `LeftJoin` 方法指定要关联的和关联条件,其中 `"posts_comments"` 是关联的名称,`s.C("id")` 示 `posts` 的 `id` 字段,`sql.Ref("posts_comments", "post_id")` 示 `posts_comments` 的 `post_id` 字段。最后我们使用 `GroupBy` 方法对 `posts` 按照 `id` 字段进行分组。 在查询时,我们先使用 `Get` 方法获取指定 `userID` 的用户实体,然后使用 `QueryPosts` 方法获取该用户发的所有文章,最后使用 `WithCommentsCount` 方法进行多关联查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值