2017-08-28 11 views
1

によってグループとの最大のタイムスタンプを選択しますMySQLのクエリは、これは私のクエリで声明

SELECT 
    log_timestamp, 
    system_name, 
    faction_name, 
    faction_allegiance, 
    faction_government_type, 
    current_state, 
    pending_state, 
    recovering_state, 
    influence AS influence, 
    transactions.transaction_id 
FROM `bgs`.`faction_log` 
    INNER JOIN `factions` ON `factions`.`faction_id` = `faction_log`.`faction_id` 
    INNER JOIN `transactions` ON `transactions`.`transaction_id` = `faction_log`.`transaction_id` 
    INNER JOIN `system_log` ON `system_log`.`transaction_id` = `transactions`.`transaction_id` 
    INNER JOIN `systems` ON `systems`.`system_id` = `transactions`.`associated_system_id` 
WHERE 
    log_timestamp BETWEEN bgs.find_closest_tick_time(date('2017-08-14')) AND bgs.find_closest_tick_time(DATE_ADD(date('2017-08-14'), INTERVAL 1 DAY)) AND 
    associated_system_id = 4 
GROUP BY 
    faction_name, 
    log_timestamp, 
    system_name, 
    faction_allegiance, 
    faction_government_type, 
    current_state, 
    pending_state, 
    recovering_state, 
    influence, 
    transactions.transaction_id 

それは正常に動作し、次のようになります。

+---------------------+-------------+-----------------+ | log_timestamp | system_name | faction_name | +---------------------+-------------+-----------------+ | 2017-08-14 11:18:46 | Nagii | Nagii Autocracy | | 2017-08-14 12:38:03 | Nagii | Nagii Autocracy | | 2017-08-14 13:40:18 | Nagii | Nagii Autocracy | | 2017-08-15 06:09:52 | Nagii | Nagii Autocracy | | 2017-08-14 11:18:46 | Nagii | Nagii Network | | 2017-08-14 12:38:03 | Nagii | Nagii Network | | 2017-08-14 13:40:18 | Nagii | Nagii Network | | 2017-08-15 06:09:52 | Nagii | Nagii Network | | 2017-08-14 11:18:46 | Nagii | Nagii Posse | | 2017-08-14 12:38:03 | Nagii | Nagii Posse | | 2017-08-14 13:40:18 | Nagii | Nagii Posse | | 2017-08-15 06:09:52 | Nagii | Nagii Posse | | 2017-08-14 11:18:46 | Nagii | Nagii Union | | 2017-08-14 12:38:03 | Nagii | Nagii Union | | 2017-08-14 13:40:18 | Nagii | Nagii Union | | 2017-08-15 06:09:52 | Nagii | Nagii Union | | 2017-08-14 11:18:46 | Nagii | Nagii United Co | | 2017-08-14 12:38:03 | Nagii | Nagii United Co | | 2017-08-14 13:40:18 | Nagii | Nagii United Co | | 2017-08-15 06:09:52 | Nagii | Nagii United Co | +---------------------+-------------+-----------------+ 20 rows in set (0.00 sec)

しかし、私は唯一の選択したいですフィールドlog_timestampの最大値を含む行。 (この場合は2017-08-15 06:09:52)。私はそのようなものを使用してみました:

HAVING transactions.log_timestamp >= max(date('2017-08-15 06:09:52'));

が、それはそのように動作しません:私は間違って何をやっている

HAVING transactions.log_timestamp >= max(log_timestamp);

答えて

0

のようなものは、ここで別の解決策だ、サブクエリを試すことができます。選択リストのすべての列に異なる値ごとに1つの行が必要な場合は、GROUP BYは必要ありません。次のようにして、SELECT DISTINCTと同じことを行うことができます。

SELECT DISTINCT 
    log_timestamp, 
    system_name, 
    faction_name, 
    faction_allegiance, 
    faction_government_type, 
    current_state, 
    pending_state, 
    recovering_state, 
    influence AS influence, 
    transactions.transaction_id 
FROM `bgs`.`faction_log` 
    INNER JOIN `factions` ON `factions`.`faction_id` = `faction_log`.`faction_id` 
    INNER JOIN `transactions` ON `transactions`.`transaction_id` = `faction_log`.`transaction_id` 
    INNER JOIN `system_log` ON `system_log`.`transaction_id` = `transactions`.`transaction_id` 
    INNER JOIN `systems` ON `systems`.`system_id` = `transactions`.`associated_system_id` 
WHERE 
    log_timestamp BETWEEN bgs.find_closest_tick_time(date('2017-08-14')) AND bgs.find_closest_tick_time(DATE_ADD(date('2017-08-14'), INTERVAL 1 DAY)) AND 
    associated_system_id = 4 
ORDER BY log_timestamp DESC 
LIMIT 1 

あなたはちょうどあなたがその列の降順でソートし、その結果に最初の行だけを返すようにLIMITを使用することができ、最大LOG_TIMESTAMPで行をしたいので。

+0

大きなテーブルでのパフォーマンスにはどのようなものが最適ですか? –

+0

パフォーマンスを最適にするには、インデックスでテーブルを最適化することが最善です。あなたはあなたのテーブルに 'SHOW CREATE TABLE'を投稿しておらず、' log_timestamp'テーブルがどのテーブルに属しているのかわからないので、どのインデックスが必要なのかについてはコメントできません。 –

1

あなたは

WHERE 
    log_timestamp = (
     SELECT MAX(log_timestamp) 
     FROM `bgs`.`faction_log` 
     WHERE log_timestamp BETWEEN bgs.find_closest_tick_time(date('2017-08-14')) AND bgs.find_closest_tick_time(DATE_ADD(date('2017-08-14'), INTERVAL 1 DAY)) AND associated_system_id = 4 
) AND associated_system_id = 4 
+0

HAVINGセクションのこのサブクエリを使用してコースの内部結合を追加しました –

+0

Thx助けて、Sebastian –

関連する問題