首页 > 解决方案 > SQLAlchemy ORM 查询加入聚合子查询

问题描述

我有一个 SQL 查询:

SELECT d.device_name, d.device_category
FROM devices d
JOIN (
  SELECT device_category, COUNT(*) AS cnt FROM devices GROUP BY device_category
) c ON c.device_category = d.device_category
ORDER BY c.cnt DESC

现在我需要以 SQLAlchemy ORM 格式编写它(至少,我愿意)。

我的尝试是这样的:

sub_dquery = db.session.query(Devices.device_category, func.count('*')).group_by(Devices.device_category).subquery()
long_dquery = db.session.query(Devices.device_name, Devices.device_category).join(sub_dquery).desc()

我不知道如何实现这部分:

c ON c.device_category = d.device_category

标签: mysqlsqlsqlalchemyorm

解决方案


这看起来非常接近:

with Session(engine) as session:
    sub_dquery = (
        session.query(Devices.device_category, func.count().label("cnt"))
        .group_by(Devices.device_category)
        .subquery("c")
    )
    long_dquery = (
        session.query(Devices.device_name, Devices.device_category)
        .join(sub_dquery, sub_dquery.c.device_category == Devices.device_category)
        .order_by(sub_dquery.c.cnt.desc())
    )
    print(long_dquery)
    """
    SELECT devices.device_name AS devices_device_name, devices.device_category AS devices_device_category 
    FROM devices 
    JOIN (
        SELECT devices.device_category AS device_category, count(*) AS cnt 
        FROM devices GROUP BY devices.device_category
    ) AS c ON c.device_category = devices.device_category 
    ORDER BY c.cnt DESC
    """

推荐阅读