mysql - 左加入 Django 模型查询?

标签 mysql django django-queryset

我想在django模型查询中使用mysql查询的left join。

我想使用的 mysql 查询是:

select U.id, B.id as boardId, count(BJ.id) as countBoardMember,
       count(NM.id) as newsCountInBaord
from users as U
left join boards as B on B.userId = U.id
left join board_join as BJ on B.id = BJ.boardId
left join news_mappings as NM on NM.boardId = B.id
where B.isArchived = false
group by B.id
having countBoardMember < 10 and newsCountInBaord < 5
limit 10

但是 Django 模型查询正在使用左外连接然后使用内连接:

SELECT `users`.`id`, COUNT(`board_join`.`joinedBy`) AS `countBoardMember`,
       COUNT(`news_mappings`.`id`) AS `newsCountInBaord`
FROM `users`
LEFT OUTER JOIN `boards` ON (`users`.`id` = `boards`.`userId`)
LEFT OUTER JOIN `board_join` ON (`boards`.`id` = `board_join`.`boardId`)
LEFT OUTER JOIN `news_mappings` ON (`boards`.`id` = `news_mappings`.`boardId`)
INNER JOIN `boards` T6 ON (`users`.`id` = T6.`userId`)
INNER JOIN `board_join` T7 ON (T6.`id` = T7.`boardId`)
WHERE (T7.`requestStatus` = approved AND T6.`isArchived` = False)
GROUP BY `users`.`id`
HAVING (COUNT(`board_join`.`joinedBy`) > 10 AND COUNT(`news_mappings`.`id`) > 5)
ORDER BY NULL limit 10;

实现我的结果需要更长的时间。

我的 django 模型查询是这样的:

user_ids = (
    Users.objects.using('cms')
    .annotate(countBoardMember=Count('boards__boardjoin__joinedBy'),
              newsCountInBaord=Count('boards__newsmappings__id'))
    .filter(boards__isArchived=0, boards__boardjoin__requestStatus='approved', 
            countBoardMember__gt=10, newsCountInBaord__gt=5).all()
)

我在 Django 模型查询中做错了什么?

最佳答案

创建外部连接是因为字段“newsmappings”、“joinedBy”和“boardjoin”可能为空。

您可以执行以下操作之一:

  1. 删除模型板中的“null=True”,board_join,news_mappings 到这些字段不能为空
  2. 向查询添加过滤器以排除空条目。例如:

    user_ids = (
    Users.objects.using('cms')
    .annotate(countBoardMember=Count('boards__boardjoin__joinedBy'),
              newsCountInBaord=Count('boards__newsmappings__id'))
    .filter(boards__isArchived=0, boards__boardjoin__requestStatus='approved', 
            countBoardMember__gt=10, newsCountInBaord__gt=5,
            boards__isnull=False, boards__boardjoin__isnull=False,
            boards__newsmappings__isnull=False).all()
    )
    

关于mysql - 左加入 Django 模型查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188015/

相关文章:

php - Mysql、phpmyadmin、创建数据库

mysql - 外键约束和桥接表

mysql - MySQL 中何时使用单引号、双引号和反引号

python - 为什么我的静态文件没有加载到 django 中?

php - 按供应商分组获取多行的多个总和

python - 计时 Django 数据库查询

python - 更改 django 中的日期格式

Django QuerySet 更新性能

python - 根据第一个子模型的属性对查询集进行排序,会返回重复的对象。 Django ,DRF

django - 在 Django 模型查询集上切片