【问题标题】:Doctrine SQL query: works on MySQL, on PostgreSQL won'tDoctrine SQL 查询:适用于 MySQL,不适用于 PostgreSQL
【发布时间】:2010-04-15 17:23:21
【问题描述】:

这是一个由 Doctrine ORM 的 Taggable 扩展自动生成的查询。

SELECT t.id AS t__id, t.name AS t__name, COUNT(DISTINCT i.id) AS i__0,
   (COUNT(DISTINCT i.id)) AS i__1
FROM taggable_tag t
LEFT JOIN cms__model__image_taggable_tag c ON (t.id = c.tag_id)
LEFT JOIN image i ON i.id = c.id
WHERE t.id IN
    (SELECT doctrine_subquery_alias.id
     FROM
       (SELECT DISTINCT t2.id, (COUNT(DISTINCT i2.id)) AS i2__1
        FROM taggable_tag t2
        LEFT JOIN cms__model__image_taggable_tag c2 ON (t2.id = c2.tag_id)
        LEFT JOIN image i2 ON i2.id = c2.id
        GROUP BY t2.id HAVING i2__1 > 0
        ORDER BY i2__1 DESC LIMIT 10) AS doctrine_subquery_alias)
GROUP BY t.id HAVING i__1 > 0
ORDER BY i__1 DESC

它在使用 MySql 时有效,但不适用于 PostgreSql。

我得到:column i2__1 not foundcolumn i__2 not found

使用 COUNT(DISTINCT) 时是否不允许使用别名?
这个查询在 PostgreSql 上应该如何工作?

【问题讨论】:

    标签: mysql zend-framework postgresql doctrine portability


    【解决方案1】:

    您可以尝试在子选择的HAVING 子句中将i2__1 替换为COUNT(DISTINCT i2.id),或者删除COUNT(DISTINCT i2.id) 周围的括号。

    您可能还必须将t__name 添加到主选择的GROUP BY 子句中。

    【讨论】:

    • 谢谢,就是这样。这是 Doctrine 还是我的 PostgreSql 版本中的错误?还是 PostgreSql 根本不支持这种语法?
    • 哪个建议对你有帮助?
    • 删除括号什么也没做。我不得不在 HAVINGs 而不是别名中重复 COUNT(它会更慢吗?)。显然,GROUP BY 中也需要 t.name。
    • 我认为性能不会受到影响。我不知道 SQL-Server,但是 Oracle 也不支持生成的语法。
    • 我也没有。而且,坦率地说,在我最近一直在做的所有 MySQL/Doctrine/PostgreSQL 工作中,我可以告诉你,与我在运行的非常高端的系统上所采取的一些措施相比,这样的性能损失微不足道。 MySQL 通过 Doctrine。
    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2015-06-04
    • 2021-11-24
    • 2022-01-26
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多