0

Rails like 構文に変換する必要がある次のクエリがあります。それを行う方法はありますか、それとも単純な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 の端末のみが選択されるようにすることであり、端末のシリアルのみが必要です。このクエリは、すべてのユーザーの端末の概要を示し、端末が提供したログの数と、最後のログがいつ発生したかを表示するために必要です。クエリは私のテストデータで機能しますが、レールでの実装は私にとって少し複雑です。

ありがとう!

編集

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]])
4

1 に答える 1

1

私はレールについて何も知らないと主張しているわけではないので、質問のその部分には答えられません。しかし、プレーンな 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

これにより、パフォーマンスが向上するはずのサブクエリが 1 つ削除されます。

于 2012-05-08T19:23:42.283 に答える