2011-10-20 21 views
13

これは私がdate_entered入力された最新のcomputer_idあたりreport_idの一覧が表示されますSELECT文を必要とするテーブル構造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 

であり、私はどのようにそれを行うには見当もつかない。誰かが私を正しい方向に向けることができますか?あらかじめThx。

答えて

28

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

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 
) 
+2

ほぼです。私は "a.report_id = b.report_id"を省き、それはトリックでした。ありがとうございます – poetter747

+2

これはあまりにも多くのサブクエリを生成しているため、少し非効率です。 代わりに、無関係なサブクエリを使用してください。 https://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html – Pablo

+0

パブロが正しいです。サブクエリを結合することでフィルタリングを早期に行うことができ、パフォーマンスが低下します。 – twicejr

11

最後の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. 
+2

idはこれを行うと、私は間違っを取得report_id。私はWHERE computer_id = 30のステートメントをチェックしました。結果は、見つかったすべてのreport_idの最初のreport_idと最新の日付との組み合わせである – poetter747

3

Accordig: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 
+0

これは最大日付を取得しますが、必ずしも同じ行の他の値とは限りません。 – Vincent

0
SELECT report_id, computer_id, date_entered 
FROM reports 
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1 
) 
+1

このコードスニペットをご利用いただき、ありがとうございます。適切な説明(* meta.stackexchange.com/q/114762)は、*なぜ*これが問題の良い解決策であるかを示すことで長期的な価値を向上させ、将来の読者にとって他の同様の質問。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 –