2012-03-16 17 views
1

データベースのクエリを作成しようとしています。配列を使用したSQLクエリ

基本的に部屋のイベントを含む別のデータベースと照合する必要がある部屋番号を含む文字列があります。私はその部屋で次のイベントが起こっているのを見たい。 例: 私は[ZACH102、ZACH103]を含む配列ルームを持っています。私はZACH102とZACH103で起こっている次のイベントを返すデータベースを探したい。私は以下の質問を使用して1部屋のイベントを見つける方法を知っています。しかし、私はどのように配列を使ってこれを行うのですか?

select name, 
     eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
from  the_table 
where the_table.room = ZACH102 
order by time_from_test 
limit 1 

ありがとうございます!

編集:申し訳ありませんが、私の説明では十分にはっきりしませんでしたが、配列の各部屋で最も早いイベントが必要です。最後にlimit 1に注意してください。

EDIT:はい、私はZACH 102からの1つのイベントだけを望むことを意味するためにそこに1を入れて、ZACH 103から1つのイベントが必要です。

+0

どのように配列を渡しているの?それはSQL配列か、関数を呼び出すときに別の言語を使用していますか? – Gage

+0

PHPの情報を解析して部屋の名前を配列に格納するデータベースクエリの結果があります。それから私は上記のクエリの配列を – maknelly

+0

に使っています。また、time_from_testが必要ですか、現在のシステム時刻から次のイベントを探していますか? – Gage

答えて

3

私は共通テーブル式を使用します。あなたはIN (...)句の内容を知らない場合には、最終的にあなたが動的にこれを設定するつもり必要だ

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    where the_table.room in ('ZACH102', 'ZACH103') 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 

:しかし、それはあなたがMySQLを使っているように、私はこのような何かをしたいに見えるので、あらかじめ。その時が来たら、あなたの配列がすでにテーブルのどこかに格納されているように、前もって計画を立てるのが最善です。それはあなたに2つの選択肢を与えます。最初は巣にあなたのIN (...)状態でサブクエリです:

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    where the_table.room in (select room from shopping_cart where session_key='MySessionKey') 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 

他の結合を使用することです:

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    inner join shopping_cart on shopping_cart.room = the_table.room 
    where shopping_cart.session_key = 'MySessionKey' 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 
1
where the_table.room in ('ZACH102', 'ZACH103') 
+0

これは私に2イベントを返します。そのうちの1つはzach102のもっとも早いイベントで、最も早いイベントは103のzachですか? また、私の配列の名前が$ roomsの場合はどうすればいいですか $$のroomのthe_table.roomはどこですか? – maknelly

+0

where句を使用すると、基本的に、クエリはZACH102とZACH103の部屋のすべてのレコードを返します。その後、あなたの注文はすべてのレコードを時間順に並べ替えます。それで、それは部屋の1つのトップタイムのみを選択します。各部屋のトップタイムをお探しですか? – Gage

+0

はい、私は各部屋のトップタイムを探しています。 – maknelly

関連する問題