使用MySQL和Django中的Count加入2个表

时间:2017-04-11 23:16:18

标签: mysql sql django django-models django-mysql

第1部分:MySQL

从MySQL数据库如何加入以下两个计数

SELECT COUNT(activity_id) as activities, user_id FROM Activity 
    WHERE activity_completed_time IS NOT NULL
    AND group = somevalue
    GROUP BY user_id;

SELECT COUNT(id) as comments, author_id FROM Comment
    WHERE group = somevalue
    GROUP BY author_id;

这些查询返回两个单独的表,但我应该可以在Activity.user_id = Comment.author_id上加入它们。

第一个查询给出:

activities | user_id

第二个查询给出:

comments | author_id

我想要回归的是:

user_id | activities | comments

我还需要0个活动和评论值,它们只出现在1个表中(NULL可以正常工作)。

第2部分:Django

是否可以在Django中的单个查询中执行此操作而不使用原始查询?

在Python中使用2个Django查询集或SQL连接2个单独的查询会更快吗?

我对存储在不同模型中的用户有活动和评论:

class Activity(models.Model):
    user_id = models.CharField(max_length=50, primary_key=True)
    activity_id = models.CharField(max_length=5)
    activity_completed_time = models.DateTimeField()
    group = models.CharField(max_length=70, primary_key=True)


class Comment(models.Model):
    id = models.IntegerField(primary_key=True)
    author_id = models.CharField(max_length=50)
    group = models.CharField(max_length=70, primary_key=True)

具有返回必要数据的条件的两个单独查询是:

Activity.objects.values('user_id')
                .filter(group='value')
                .filter(activity_completed_time__isnull = false)
                .annotate('total_completed' = Count('activity_id'))

Comment.objects.values('author_id')
               .filter(group='value')
               .annotate('total_comments' = Count('id'))

显然有可能以几种不同的方式做到这一点,我试图找到最快捷的方式,因为我在Activity表中处理超过550万条记录,在Comment表中处理超过790k条记录。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要加入2个查询集。

试试这个答案:

How to combine 2 or more querysets in a Django view?

如果这不是您想要的,并且您需要一些内/外SQL连接,那么您应该考虑执行一些RAW SQL。