2017-03-20 3 views
0

私はアイテムの入札のユーザとデータを持っているが、(時間ASCでソートされたと言うことができます):オラクルつの列が2列目の二つの値に依存して選択行

item_id, win, user_id 
------------------ 
1, 0, 1 
1, 0, 2 
1, 1, 1 
2, 0, 3 
2, 0, 4 
2, 1, 3 

私はこれらのユーザーを選択する必要があり、失われましたアイテムの入札でしたがって、item_id = 1の場合、ユーザnr1が失われ、ユーザnr2が高くなり、ユーザnr2も失われたため、ユーザnr1が失われたため、ユーザnr1が失われた。このアイテムの場合、SELECTはuser_id = 2を返す必要があります。

このようなユーザーをすべてスマートな方法で選択するにはどうすればよいですか?あなたのテーブル名で、ここ

+0

'私は、10ユーザーが入札する場合は、だから、item'のために入札に失われただけで、これらのユーザーを、選択する必要があり、そして9失われた入札これらの9人のユーザーをすべて選択する必要がありますか? –

+0

はい。これらを除いて、紛失したが最終的に勝った(これは難しい) – bry888

答えて

3
SELECT item_id, user_id 
FROM  your_table 
GROUP BY item_id, user_id 
HAVING MAX(win) = 0; 
+0

非常に良いときれいな解決策。単純なクエリではなく簡単な説明で答えは良くなりました。 –

+1

@ThorstenKettner - 私は一般的なケースであなたに同意します。この特別な例では、解決策はそのような基本的なSQLステートメントなので、説明は必要ありません。 SOは最初の2日間の基本的なSQLを学び/教える場所ではありません。 – mathguy

+0

@ThorstenKettner私は普通はそうですが、最も簡単な 'GROUP BY'節と' HAVING'節以外に何も使用する必要はありませんので、テキストは単に "あなたが' GROUP BY'で列を表現し、 'HAVING 「勝ったことのない人に制限する」この単純なクエリが英語の文章を使用する代わりに複製するだけで、コードにすぐには見えない解決策には何も追加されません。 – MT0

0

変更「入札」

select t.item_id, t.user_id from (
    select item_id, user_id 
    from bids 
    group by item_id, user_id 
) t 
left join (select item_id, user_id from bids where win = 1) winners 
ON 
t.item_id = winners.item_id 
AND 
t.user_id = winners.user_id 
WHERE 
winners.item_id IS NULL 
+1

このような単純な問題に対しては、あまりにも複雑で非効率的である。 – mathguy

+0

私はこれを試してみて、それは合理的に見える/良い結果を与える。私は明日よりそれをテストします – bry888

関連する問題