2010-12-07 21 views
1

私は検索しましたが、関連する回答を見つけるのに十分なほど質問を凝縮できません。私の経験から、これはデザイン上の問題である可能性があると言われています。MySqlで複合1対多クエリ

current_status 
id 
user_id 
status_id 
created 

users 
user_id 
other... 

current_statusは主に監査目的で使用されています。ユーザー状態が変わるたびに、新しいレコードがcurrent_statusに挿入されます。

クエリは、各ユーザーの最新のステータスだけでなく、ユーザーの詳細を返したいと考えています...

SELECT users.*, current_status.status_id AS status 
FROM users 
JOIN current_status ON users.user_id = current_status.user_id 
WHERE users.user_id = '1' 

ユーザーに対して最新のstatus_idを返すようにクエリに指示するにはどうすればよいですか。

ORDER BY current_status.created DESC LIMIT 0,1 

ただし、複数のユーザーを返す場合はどうすればよいのでしょうか?

ご協力いただければ幸いです。あなたは後で自分でクエリを保存するために、テーブルに参加したい場合は

答えて

1

EDITあなたは、また、EDITv2

SELECT users.*, 
     (SELECT current_status.status_id 
      FROM  current_status 
      WHERE current_status.user_id = users.user_id 
      ORDER BY current_status.created DESC 
      LIMIT 1) AS status 
FROM  users 
WHERE  users.user_id = '1' 

...私は今、あなたのテーブル/列のこつを持っていると思います使用することができます。おそらく、

SELECT users.*, current_status.* 
FROM  users 
    LEFT JOIN current_status 
    ON  current_status.status_id = (
    SELECT current_status.status_id 
    FROM  current_status 
    WHERE current_status.user_id = users.user_id 
    ORDER BY current_status.created DESC 
    LIMIT 1 
) 
WHERE  users.user_id = '1' 
+0

ありがとうございます。私は、SELECT文を除くすべての箇所でサブクエリを使用しました。それは魅力のように機能します。 – csi

+0

喜んで助けてください!また、将来の参照のために正しい答えを記入することを忘れないでください。 ;-) –

0

このような何かを?

SELECT users.*, current_status.status_id AS status 
FROM 
users, 
current_status 
WHERE users.user_id = '1' AND 
users.user_id = current_status.user_id AND 
current_status.status_id IN (SELECT max(status_id) FROM current_status GROUP_BY user_id)) 
0

悲しいことにMySQL doesn tサポートover(order by ...)機能。最後にすべてのステータスを選択するためにサブクエリが使用されます:

select 
    user.user_id, status.status_id, status.created 
from user 
    join status on user.user_id = status.user_id 
    join (
    select user_id, max(created) 
    from status 
    group by user_id 
) last_status 
on 
    status.user_id = last_statuses.user_id 
    and status.created = last_statuses.created