我正在制作一个小型的志愿服务系统,在我的志愿服务表中,我有两列用户可以自愿参加活动。
表格如下:
id event_name user_1 user_2 created_at
我希望实现的是当用户自愿参加活动时,会向他提供下一个可用的用户位置。即,如果user_1
和user_2
没有值,并且用户是志愿者,则为他分配第一个可用的插槽(user_1
)并且user_id
不为空,保存用户user_2
列中的ID。
我运行了一个查询,根据事件ID返回user_1
和user_2
列。我遇到的问题是编写PHP代码来选择第一个可用的空数组项,这样我就可以保存用户ID了吗?
希望我有点理解......
由于
答案 0 :(得分:1)
最好将该表规范化为事件表和event_volunteers表。
event(id, name, max_volunteers)
event_volunteers(event_id, user_id)
然后您不必担心哪个字段为空,并且您不会将自己限制为每个事件的两名志愿者 - 即更灵活。
相反,您可以通过将event_volunteers的数量与max_volunteers
字段进行比较来检查事件是否对志愿者“开放”。
select e.id, e.name
from event e
left join event_volunteers ev
on e.id = ev.event_id
group by e.id
having count(ev.event_id) < e.max_volunteers
使用left join
,如果没有特定null
的志愿者,则会为event_volunteers
的所有字段返回event
个值。 count()
会忽略null
个值,因此即使有一行需要计算,计数也会为0
。
您可以通过引入where
子句来限制此项以检查特定事件。
要将志愿者分配给某个活动,您只需将他们的user_id
插入event_volunteers
表。
然后,您可以通过执行上述查询来提取所有志愿者的列表,但不包括group by
或having clause
,例如:
select e.id, e.name, ev.user_id
from event e
inner join event_volunteers ev
on e.id = ev.event_id
这只会显示至少有一名志愿者的事件(因为inner join
)。您是否希望与志愿者(如果有的话)一起展示所有活动。将inner join
更改为left join
,如果没有该活动的志愿者,您将在null
中获得ev.user_id
个值。