mysql - 使用多个 JOINS 将 MYSQL 查询转换为 HQL

标签 mysql sql grails hql grails-orm

大家。

我使用 grails 3.3.0.M2 框架和 mysql 作为数据源,以下 sql 查询按预期工作

SELECT 
    c.name,
    SUM(CASE
        WHEN t.status = 'open' THEN 1
        ELSE 0
    END) 'open',
    SUM(CASE
        WHEN t.status = 'pending' THEN 1
        ELSE 0
    END) 'in progress',
    SUM(CASE
        WHEN t.status = 'closed' THEN 1
        ELSE 0
    END) 'closed'
FROM
    tickets t
        INNER JOIN
    users u ON t.user_id = u.id
        INNER JOIN
    user_coordinations uc ON uc.user_id = u.id
        INNER JOIN
    coordinations c ON c.id = uc.coordination_id
GROUP BY 1

我使用隐式 JOIN 转换为 HQL 但得到了错误的结果,这是 hql 查询:

SELECT 
    c.name,
    SUM(CASE
        WHEN t.status = 'open' THEN 1
        ELSE 0
    END),
    SUM(CASE
        WHEN t.status = 'pending' THEN 1
        ELSE 0
    END),
    SUM(CASE
        WHEN t.status = 'closed' THEN 1
        ELSE 0
    END)
FROM
    Ticket t, User u, UserCoordination uc, Coordination c
WHERE
    MONTH(t.dateCreated) = :month
GROUP BY 1

为了获得正确的结果,堆栈溢出用户帮助我理解查询需要使用显式联接,这里的问题:Group by a field that does not belongs to the consulted table

现在我正在尝试以下查询:

SELECT 
    c.name,
    SUM(CASE
        WHEN t.status = 'open' THEN 1
        ELSE 0
    END),
    SUM(CASE
        WHEN t.status = 'pending' THEN 1
        ELSE 0
    END),
    SUM(CASE
        WHEN t.status = 'closed' THEN 1
        ELSE 0
    END)
FROM
    Ticket t
        INNER JOIN
    User u
        INNER JOIN
    UserCoordination uc
        INNER JOIN
    Coordination c
WHERE
    MONTH(t.dateCreated) = :month
GROUP BY 1

但是我收到了com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,其中包含引起的消息您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“inner join user_coordinations usercoordi2_ on inner join opportunity 协调 coordinat”附近使用的正确语法

感谢您的帮助和时间

最佳答案

SELECT new map(
    c.name as name,
(CASE
        WHEN t.status = 'open' THEN 1
        ELSE 0
    END) as open,
(CASE
        WHEN t.status = 'pending' THEN 1
        ELSE 0
    END) as pending, 
(CASE
        WHEN t.status = 'closed' THEN 1
        ELSE 0
    END) as closed,
    SUM(open) as openSum,
    SUM(pending) as pendingSum,
    SUM(closed) as closedSum
)
FROM
    Ticket t
        left join t.user u left join u.userCoordination uc left join uc.coordination c 
WHERE
    MONTH(t.dateCreated) = :month

//按 1 分组

上面你缺少的东西更像是你需要的,你需要的 选择新 map (i.item as item...如果您将其基础知识与您所拥有的以及我尝试做的进行比较,您就会明白为什么会出现错误。

不确定你的分组依据应该是按什么分组。不确定内部联接是否意味着联接,如果是这种情况,则省略所有左联接,因为左联接尝试连接并获取任何空的 hasMany 关系等。

关于mysql - 使用多个 JOINS 将 MYSQL 查询转换为 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974695/

相关文章:

grails - 比较两个Groovy日期

mysql - UNION ALL -> ORDER BY 未按预期工作...?

mysql - 为什么我不能在返回多个字段的请求中关联一个变量?

php - mysql查询错误是什么?

sql - 查找时间戳间隔 > 15 分钟的连续记录

sql - Hive 将无法识别查询中第二个条件中的列名

java - 仍然对 Java 时间戳等与 MySQL 混淆

c# - 如果记录在表中则插入或更新

html - 从字符串中转义HTML以及\r\t和\n

java - 使用 Gradle 将 .jar 发布到私有(private) Maven