mysql使用表中的值作为条件

uqcuzwp8  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(299)

有人能帮我回答我需要的问题吗。我已经看了好几个小时了,但我不明白。
所以事情是这样的。。。。
我有三张table
表1事件

-----------------------------------------
| ID | name | date | seats | ... |
-----------------------------------------
| 1 | name1 | 01/01 | 50 | ... |
| 2 | name2 | 02/02 | 60 | ... |
| 3 | name3 | 03/03 | 55 | ... |
| 4 | name4 | 04/04 | 40 | ... |
| 5 | name5 | 05/05 | 100 | ... |
| 6 | name6 | 06/06 | 20 | ... |
-----------------------------------------

表2人员

-----------------
| ID | person|
-----------------
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
| 5 | name5 |
| 6 | name6 |
-----------------

表3预订

---------------------------------
| ID | idperson |idevent|
---------------------------------
| 1 | 1 | 2 |
| 2 | 1 | 5 |
| 3 | 2 | 5 |
| 4 | 4 | 2 |
| 5 | 2 | 1 |
| 6 | 6 | 3 |
---------------------------------

所以我的问题是:
当我向一个人提供活动时,我想确保仍然有空座位。因此我需要从预订中计算idevent,并检查活动中的座位数是否已达到。最后,我想有一个名单与所有可用的事件,该人还没有预订。
如何编写查询?

yruzcnhs

yruzcnhs1#

最后,我想有一个名单与所有可用的事件,该人还没有预订。
下面是一种使用相关子查询的方法:

select e.*
from events e
where 
    not exists (select 1 from reservation r where r.idevent = e.idevent and r.idperson = ?)
    and (select count(*) from reservation r where r.idevent = e.idevent) < e.seats

问号表示要为其显示报告的人员的id。
第一个子查询过滤出此人已经预订的事件,第二个子查询确保仍然有可用的座位。
您可以通过使用单个子查询进行筛选来缩短查询,尽管这样会使查询更难执行:

select e.*
from events e
where not exists (
    select 1
    from reservation
    where r.idevent = e.idevent
    group by r.idevent
    having count(*) = e.seats or max(r.idperson = e.idperson) = 1
)

相关问题