【问题标题】:SQLAlchemy ORM query joined to aggregate subquerySQLAlchemy ORM 查询加入聚合子查询
【发布时间】:2021-09-21 17:39:46
【问题描述】:

我有一个 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

【问题讨论】:

    标签: mysql sql sqlalchemy orm


    【解决方案1】:

    这看起来很接近:

    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
        """
    

    【讨论】:

    • 谢谢,这正是我需要的:)
    猜你喜欢
    • 2020-05-26
    • 2014-05-19
    • 2022-01-21
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2022-01-21
    • 2013-12-06
    • 2014-09-04
    相关资源
    最近更新 更多