FROM子句中的多列结果子查询

1 投票
1 回答
1193 浏览
提问于 2025-04-17 20:38

我想把这个查询转换成Django的查询集(queryset)形式:

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的键之间没有外键约束(这个我无法更改,因为不是我负责的代码),但它们的值之间确实有关系。

我已经成功写了一个子查询,能根据我的需求获取结果。现在我不太明白怎么把这个子查询嵌入到主查询里(当然前提是ORM支持这样做)。我现在的查询看起来是这样的:

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

编辑 我不想使用原始SQL查询的主要原因是,我不确定MySQL会一直作为这个软件使用的数据库。例如,这个查询在Oracle上就无法使用。

1 个回答

0

你有没有想过为什么不使用原始SQL呢?

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')

撰写回答