如何在Rails中执行复杂查询

时间:2012-05-08 19:15:37

标签: mysql ruby-on-rails-3

我有以下查询,我需要转换为rails语法。有没有办法做到这一点,或者为此只使用普通的MYSQL更好吗?

SELECT `terminals`.`serial`, Count(*) AS count, MAX(`logs`.`created_at`) AS created_at 
FROM 
(SELECT * FROM `terminals` WHERE `terminals`.`user_id`= 1) AS terminals 
INNER JOIN `bap-backend`.`logs` ON terminals.`serial`=`logs`.`serial` 
GROUP BY `serial` ORDER BY `logs`.`created_at`

内部选择是确保只选择current_user的终端,然后我只需要终端串口。我需要此查询来概述所有用户的终端,并显示终端提供的日志数以及上次发生日志的时间。查询适用于我的测试数据,只有rails中的实现对我来说有点复杂。

谢谢!

修改

对于Google用户,只需使用find_by_sql,您仍然可以在其中添加变量。只需在命令前添加一个类,如下例所示:

@items_event = Item.find_by_sql(["SELECT items.*, ei_relationships.itemprice, ei_relationships.currency, ei_relationships.itemunit
                                      FROM `ei_relationships` INNER JOIN `items` ON `items`.`id` = `ei_relationships`.`item_id`
                                      WHERE `ei_relationships`.`event_id` = ?", @event[:id]])

1 个答案:

答案 0 :(得分:1)

我没有声称对rails有任何了解,所以我无法回答这部分问题。但是如果你坚持使用普通的MySQL,你的查询可以稍微清理一下:

SELECT
    terminals.serial,
    COUNT(*) AS count,
    MAX(logs.created_at) AS created_at 
FROM 
    terminals 
    INNER JOIN `bap-backend`.logs
        ON terminals.serial = logs.serial AND terminals.user_id = 1 /* instead of performing a subquery, just add this to your join conditions */
GROUP BY
    serial
ORDER BY
    logs.created_at

这会取出一个子查询,这有助于您的表现。