带有数组的SQL查询

时间:2012-03-16 18:10:24

标签: mysql 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

编辑:是的,我把限制1放在那里意味着我只想要来自ZACH 102的1个事件然后我想要来自ZACH 103的1个事件。我解释说上面的代码只找到1个房间的事件。

2 个答案:

答案 0 :(得分: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 :(得分:1)

where    the_table.room in ('ZACH102', 'ZACH103')