2011-12-15 19 views
44

最新のレコードid=1のサインインの列に基づいていますが、3つのレコードすべてではありません。MySQL:最新のレコードを取得

+----+---------------------+---------+ 
| id | signin    | signout | 
+----+---------------------+---------+ 
| 1 | 2011-12-12 09:27:24 | NULL | 
| 1 | 2011-12-13 09:27:31 | NULL | 
| 1 | 2011-12-14 09:27:34 | NULL | 
| 2 | 2011-12-14 09:28:21 | NULL | 
+----+---------------------+---------+ 

答えて

53

IDでグループ化されたMAX(signin)を使用してください。各idの最新のsigninが表示されます。

SELECT 
id, 
MAX(signin) AS most_recent_signin 
FROM tbl 
GROUP BY id 

全体の単一のレコードを取得するには、IDごとにのみMAX(signin)を返すサブクエリに対してINNER JOINを行います。

SELECT 
    tbl.id, 
    signin, 
    signout 
FROM tbl 
    INNER JOIN (
    SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id 
) ms ON tbl.id = ms.id AND signin = maxsign 
WHERE tbl.id=1 
+0

はここにあなたの**最初**回答に基づいて働いていたものです:ID = 1、ID BY TBLグループから 'IDを選択し、MAX(サインイン);' – enchance

+0

私が取得する(第二ソリューションを実装しようとしました行全体)は自分の状況では、私はいつも空の結果セットを得る – rantsh

+1

@rantshそれは間違っていたので!私は上記を訂正しました。 –

46
SELECT * 
FROM tbl 
WHERE id = 1 
ORDER BY signin DESC 
LIMIT 1; 

明らか指数は(id)、または(id, signin DESC)multicolumn indexになります。 @ xQbertの答えの上

+5

これはそれを行う最もクリーンな方法のように感じる! – karancan

+0

サインイン列のインデックスを作成することを検討してください。プロセスが大幅に高速化されます。 –

+0

'SELECT TOP 1 *'を使用して、最後の 'LIMIT 1'を削除してください。 SQL Serverを使用している場合MySQLまたはPostgresの場合は上記を使用してください。 – jaredbaszler

3
Select [insert your fields here] 
from tablename 
where signin = (select max(signin) from tablename where ID = 1) 
+3

** *を絶対に使用しないでください。常にフィールドを定義してください。** – zerkms

+4

@zerkms: '*'が偶数*好ましい*の状況があります。これは、初期バインディングとレイトバインディングの問題です。 –

+2

@Erwin Brandstetter:私は実際に2年後に私の意見を変更しました – zerkms

8

ビルは、あなたがサブクエリを回避し、任意のID

SELECT id, signin, signout 
FROM dTable 
INNER JOIN(
    SELECT id, MAX(signin) AS signin 
    FROM dTable 
    GROUP BY id 
) AS t1 USING(id, signin) 
+0

こんにちはこのクエリはどのように機能し、xQbertの答えよりも効率的ですか?両方のクエリは、私のためにほぼ同じ時間に実行されます。私は、通常とは何かを置き換えるクエリの部分を使用することを理解していません。 – ZJS

1
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id; 
+1

これは動作しません。 –

0

私は同様の問題があったことでフィルタリングするのに十分な、それは一般的なことができます。私はページコンテンツの翻訳の最後のバージョンを取得する必要がありました。言い換えると、バージョンの列で最も高い番号を持つ特定のレコードを取得する必要がありました。だから私はすべてのレコードをバージョン順に選択し、LIMIT節を使って結果から最初の行を取ります。

SELECT * 
FROM `page_contents_translations` 
ORDER BY version DESC 
LIMIT 1 
関連する問題