2012-01-09 9 views
4

私は単純な問題のように思えます。たぶん私は思っていた/グーグル/それについての周りを探していたので、ちょうど混乱しているかもしれません。外部キーごとに最高のレコードタイプを選択してください

次の表を考えてみましょう。次のselectを実行

log_id (auto increment primary key) 
domain_id (foreign key to "domains" table) 
type (enum('notice','warning')) 
message (varchar) 

SELECT * 
FROM logs 
WHERE domain_id = 4 

は '予告' と言う、タイプの2つのログを私を与えると型の3 '警告' だろう。

最高のIDがtypeのログだけを選択するにはどうすればよいですか?効果的に最新のログをdomain_idtypeとしてください。

はちょうど私が愚かな感じさせる記述が、私はあなたの助けのための

おかげで...右のそれを得るように見えることはできません。

クリス

編集:今後の参考のため 、あなたが最初のテーブルからすべてのレコードを選択して表示し結合テーブルの最新の記録を(この場合はすべてのドメインおよびその最新のログを選択したい場合は、レコード(利用可能な場合))、単にその周りのドメインのテーブルの上の選択をラップ:

SELECT 
    domains.*, 
    logs.* 
FROM 
    domains 
LEFT JOIN (
    SELECT 
    l.* 
    FROM 
    logs l 
    INNER JOIN (
    SELECT 
     MAX(log_id) as maxid 
    FROM 
     logs 
    GROUP BY 
     domain_id 
     type 
) l3 ON l.log_id = l3.maxid 
) l2 USING (domain_id) 

答えて

3

は、最初のサブクエリに参加:

select 
    l.* 
from 
    log l 
    inner join (
    select 
     max(log_id) as maxid 
    from 
     log 
    group by 
     domain_id, 
     type 
    ) l2 on 
     l.log_id = l2.maxid 
をあなたはEXISTSを使用することができます
+0

+私よりも速く入力するための1: – MatBailie

+0

ありがとうエリック、魅力のように動作します。 – Chris

1

そして、さまざまな(私はエリックの答え@使用すると思いますが)...あなたが必要なもの

SELECT 
    * 
FROM 
    log 
WHERE 
    NOT EXISTS (
    SELECT * 
    FROM log AS lookup 
    WHERE domain_id = log.domain_id 
    AND type = log.type 
    AND log_id > log.log_id 
) 
+0

あなたの答えもありがとう。 – Chris

2

は、以下のこのクエリのように、GROUP BYである:

SELECT `type`, MAX(`log_id`) AS `latest_log` 
FROM `logs` 
WHERE `domain_id` = 4 
GROUP BY `type`; 
+0

あなたの答えをありがとう。これは私に最高のIDを与えるだろうが、私は全記録、すなわち最も高いログのメッセージも必要とする。 – Chris

関連する問題