【问题标题】:Subquery in FROM clause with multiple column result具有多列结果的 FROM 子句中的子查询
【发布时间】:2024-05-23 04:00:01
【问题描述】:

我正在寻找一种方法将此查询转换为等效的 Django 查询集:

SELECT a.name, b.num_something FROM table_a a, 
(SELECT id, COUNT(id) as num_something FROM table_b
 GROUP BY id ORDER BY id DESC LIMIT 10) b 
WHERE a.id=b.id;

table_a 和 table_b 的键没有通过 FK 约束连接(这是我无法触及的东西,不是我的代码部分),但值表示 table_a 和 table_b 之间的关系。

我已经设法根据我的需要获得一个子查询来检索结果。现在我没有得到将它嵌入到主查询中的部分(显然,如果 ORM 允许这样做)。我的实际查询如下所示:

Something.objects.values_list(
    'id').annotate(
        num_something=Count('id')).order_by(
            '-num_something')[:10]

编辑 我不想使用原始 SQL 查询的原因主要是因为我不确定 MySQL 是始终与软件一起使用的数据库。例如,此查询不适用于 Oracle。

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    你为什么不使用raw

    Something.objects.raw(
        'SELECT a.name, b.num_something '
        'FROM table_a a, (SELECT id, COUNT(id) as num_something '
        '                 FROM table_b '
        '                 GROUP BY id ORDER BY id DESC LIMIT 10) b '
        'WHERE a.id=b.id')
    

    【讨论】:

    • 嘿,我想如果我使用 raw,我的代码可能会在有人将数据库从 MySQL 更改为 Oracle 时中断(例如),例如 LIMIT 不存在(至少在版本 10).. 还有其他方法可以限制 Oracle 中的结果。
    最近更新 更多