2011-08-14 11 views
2

私は4つのテーブルを持っています。これらの表の構造を以下に示します(関連する列名のみを示しています)。最新のレコードをフェッチするMySQLクエリ

User (user_id) 
User_RecordType (user_id, recordType_id) 
RecordType (recordType_id) 
Record (recordType_id, record_timestamp, record_value) 

は私が与えられたユーザがアクセス権を持つ各RecordTypeためrecord_value最新のを見つける必要があります。タイムスタンプは、エポックから秒として保存されます。

私は、ユーザーがクエリでのアクセス権を持っていることをRecordTypesを取得することができます:

SELECT recordType_id 
FROM User, User_RecordType, RecordType 
WHERE User.user_id=User_RecordType.user_id 
AND User_RecordType.recordType_id=RecordType.recordType_id; 

何このクエリは、ユーザーがアクセス権を持っていることを各RECORDTYPEの最新のレコードをフェッチしている行いません。理想的には、これをすべて単一のクエリで行い、ストアドプロシージャを使用しないでください。

だから、誰かが私のSQL-fuのいくつかを貸してくれますか?ありがとう!

+1

私は 'group-n-per-group'タグを追加しました。この質問はStackOverflowで何十回も答えられています。タグに従います。 –

答えて

3
SELECT 
    Record.recordType_id, 
    Record.record_value 
FROM 
    Record 
INNER JOIN 
    (
    SELECT 
    recordType_id, 
    MAX(record_timestamp) AS `record_timestamp` 
    FROM 
    Record 
    GROUP BY 
    recordType_id 
) max_values 
ON 
    max_values.recordType_id = Record.recordType_id 
AND 
    max_values.record_timestamp = Record.record_timestamp 
INNER JOIN 
    User_RecordType 
ON 
    UserRecordType.recordType_id = RecordType.recordType_id 
WHERE 
    User_RecordType.user_id = ? 
+0

RecordテーブルのrecordType_idカラムがユニークである場合、 'AND max_values.record_timestamp = Record.record_timestamp'条件は必要ありません。 – wpearse

+0

その場合、なぜ「最新のrecord_value」、「各レコードタイプの最新のレコードを取得するか」を尋ね、タイムスタンプについて話すのはなぜですか?これは、レコードタイプごとに複数のレコードが存在することを意味します...決定してください! –

+0

申し訳ありませんダン、あなたは大丈夫です。私はrecordType_id列とrecord_id列を混同していました。私の間違い。あなたのソリューションはうまくいく - 多くのおかげさまです。 – wpearse

関連する問題