web-dev-qa-db-ja.com

MAX(日付)で選択するには?

これはテーブル構造です

CREATE TABLE `reports` (
  `report_id` int(11) NOT NULL auto_increment,
  `computer_id` int(11) NOT NULL default '0',
  `date_entered` datetime NOT NULL default '1970-01-01 00:00:00',
  `total_seconds` int(11) NOT NULL default '0',
  `iphone_id` int(11) default '0',
  PRIMARY KEY  (`report_id`),
  KEY `computer_id` (`computer_id`),
  KEY `iphone_id` (`iphone_id`)
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1

最後に入力されたreport_idからcomputer_idごとにdate_enteredをリストするSELECTステートメントが必要であり、その方法はわかりません。誰かが私を正しい方向に向けることができますか?事前に。

24
poetter747

これはそれを行う必要があります:

SELECT report_id, computer_id, date_entered
FROM reports AS a
WHERE date_entered = (
    SELECT MAX(date_entered)
    FROM reports AS b
    WHERE a.report_id = b.report_id
      AND a.computer_id = b.computer_id
)
44
bhamby

最後のdate_enteredを表示するだけですか、それともlast_dateを入力して注文するのですか?

SELECT report_id, computer_id, date_entered
FROM reports
GROUP BY computer_id
ORDER BY date_entered DESC
-- LIMIT 1 -- uncomment to only show the last date.
14
Genzume

これに応じて: https://bugs.mysql.com/bug.php?id=54784 charをキャストすることでトリックが行われるはずです:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR))
FROM reports
GROUP BY report_id, computer_id
3
Frane Poljak

回避策だが機能するソリューション

IDが自動インクリメントの場合のみ、最大日付の代わりに最大IDを検索できます。したがって、IDによって、他のすべてのフィールドを見つけることができます。

select *
from table
where id IN ( 
              select max(id)
              from table
              group by #MY_FIELD#
              )
0

私はこのソリューションを使用し、非常にうまく機能します

SELECT report_id、computer_id、date_entered FROM FROM GROUP BY computer_id having max(date_entered)

0
LuyRamone

私にぴったりの作品:

(SELECT content FROM tblopportunitycomments WHERE opportunityid = 1 ORDER BY dateadded DESC LIMIT 1);
0
xayer

これは非常に古い質問ですが、同じ問題のためにここに来たので、他の人を助けるためにここに残しています。

データ量が原因でDBのクエリに5分以上かかっていたため、クエリを最適化しようとしました。私のクエリは、受け入れられた回答のクエリに似ていました。 パブロのコメント 正しい方向に私を押して、私の5分間のクエリは0.016秒になりました。クエリ時間が非常に長い他のユーザーを支援するには、 norrelated subquery を使用してみてください。

OPの例は次のとおりです。

SELECT 
    a.report_id, 
    a.computer_id, 
    a.date_entered
FROM reports AS a
    JOIN (
        SELECT report_id, computer_id, MAX(date_entered) as max_date_entered
        FROM reports
        GROUP BY report_id, computer_id
    ) as b
WHERE a.report_id = b.report_id
    AND a.computer_id = b.computer_id
    AND a.date_entered = b.max_date_entered

コメントをありがとう Pablo あなたは私に大きな時間を節約しました!

0
Jeremy