2012-03-16 2 views
1

Я пытаюсь написать запрос для моей базы данных.SQL-запрос с массивом

В принципе, у меня есть массив строк, содержащих номера номеров, которые мне нужно сопоставить с другой базой данных, содержащей события в комнатах. Я хочу найти следующее событие в этой комнате. Ex: У меня есть комната с массивом, содержащая [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 

Заранее благодарен!

EDIT: Извините, если мое объяснение не было достаточно ясно, но мне нужно только самое раннее событие в каждой комнате в массиве. Обратите внимание на limit 1 в конце.

EDIT: Да, я помещаю ограничение 1, чтобы означать, что мне нужно только 1 событие из ZACH 102, а затем я хочу 1 событие из ZACH 103. Я объяснил, что приведенный выше код обнаруживает события только для 1 комнаты.

+0

Как вы передача массива? Является ли это массивом SQL или вы используете другой язык, а затем вызываете функцию? – Gage

+0

У меня есть результат запроса базы данных, в котором я разбираю информацию в php и помещаю имена комнат в массив. Затем я хочу использовать этот массив для запроса выше – maknelly

+0

Также это time_from_test необходимо или вы просто будете искать следующее событие из текущего системного времени? – Gage

ответ

3

В Sql Server я бы использовал общее табличное выражение. Но так как это выглядит, как вы используете MySQL, я хотел бы сделать что-то вроде этого:

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 

В конце концов, ты собираешься нужно установить это динамически, когда вы не знаете содержание вашей статьи IN (...) заранее. Когда придет время, лучше всего планировать заранее, чтобы ваш массив уже был где-то сохранен в таблице. Это даст вам два варианта. Первый заключается в гнезде суб-запрос в вашем 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 и самым ранним событием в zach 103? также, если имя моего массива - $ rooms, я просто делаю где the_table.room в $ rooms? – maknelly

+0

Использование этого предложения where в основном означает, что запрос вернет все записи с комнатой ZACH102 и ZACH103. Тогда ваш заказ будет заказывать все записи по времени. Таким образом, он будет выбирать только время для одной из комнат. Вы ищете лучшее время в каждой комнате? – Gage

+0

Да, сэр, они ищут лучшее время в каждой комнате. – maknelly

Смежные вопросы