2016-04-28 7 views
1

私はこれと同じ問題を解決しようとしています:SQLクエリは、どのアイテムがバケットにありますか?

私はDBのテーブルを持っているように:

╔════╦═════════════╦═══════════╦════════╗ 
║ ID ║ Bucket Name ║ Item Name ║ action ║ 
╠════╬═════════════╬═══════════╬════════╣ 
║ 1 ║ B_a   ║ item1  ║ insert ║ 
║ 2 ║ B_a   ║ item2  ║ insert ║ 
║ 3 ║ B_b   ║ item1  ║ insert ║ 
║ 4 ║ B_b   ║ item1  ║ remove ║ 
║ 5 ║ B_a   ║ item1  ║ remove ║ 
║ 6 ║ B_a   ║ item3  ║ insert ║ 
╚════╩═════════════╩═══════════╩════════╝ 

私は各バケットの現在の状態を取得したいSQLクエリで

╦═════════════╦═══════════════╦ 
║ Bucket Name ║ items   ║ 
╬═════════════╬═══════════════╬ 
║ B_a   ║ item2, item3 ║ 
║ B_b   ║ NULL   ║ 
╩═════════════╩═══════════════╩ 

各行を選択して出力を調べて各バケットのステータスを確認できますが、SQLクエリを使用して解決策を探しています。 どうすればいいですか?

私は現在MySqlを使用していますが、sql-serverもオプションです。

+0

私は 'item1'はバケット' B_a''にあるべきではないと思います。 'item2'があるはずです。 –

答えて

1

これは、いくつかの紆余曲折の集約クエリです。 MySQLでは、それほど難しくありません:

select bucketname, group_concat(item_name separator ', ') as items 
from buckets b 
where b.id = (select max(b2.id) from buckets b2 where b2.item_name = b.item_name) and 
     b.action <> 'remove' 
group by bucketname; 
+0

挿入物と削除物を数える必要はありませんか? – jarlh

+0

@ jarlh。 。 。私はそうは思わない。あるいは、少なくとも、最新のステータスを求めることです。 –

+0

@ GordonLinoffサブクエリにバグごとにユニークではない 'b2.bucketname'を追加する必要があると思います。 クエリが遅く実行されます(15バケットと約2000レコードに2.5秒かかります)。これは改善できますか? – yoni

関連する問題