我正在尝试为我的数据库编写查询。
基本上,我有一个包含房间号的字符串数组,我需要与另一个包含房间内事件的数据库匹配。我想找到那个房间里发生的下一个事件。 例如: 我有一个包含[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个房间的事件。
答案 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')