【问题标题】:Joining 2 tables with Count in MySQL and Django在 MySQL 和 Django 中使用 Count 连接 2 个表
【发布时间】:2017-09-07 12:52:34
【问题描述】:

第 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

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

第 2 部分:Django

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

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

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

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 条记录。

【问题讨论】:

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


    【解决方案1】:

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

    试试这个答案:

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

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

    【讨论】:

    • 感谢您的回复。因此,显然可以在 python/Django 中执行此操作,但是我认为如果我可以加入 SQL 中的记录,它可能会更快。我已经更新了问题并将其拆分为 SQL 和 Django,以便更清楚地说明我正在尝试做什么以及为什么我想在 Django 中处理之前优化 SQL。
    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 2016-02-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2014-12-08
    相关资源
    最近更新 更多