0

我有以下查询,我需要将其转换为类似语法的 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`

内部 Select 是为了确保只有 current_user 的终端被选中,然后我只需要终端串行。我需要这个查询来概述所有用户的终端,并显示终端提供了多少日志以及最后一个日志发生的时间。该查询适用于我的测试数据,只有 Rails 中的实现对我来说有点复杂。

谢谢!

编辑

对于谷歌的人,只需使用 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]])
4

1 回答 1

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

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

于 2012-05-08T19:23:42.283 回答