获取数组中的第一个可用空值

时间:2015-05-15 06:43:45

标签: php mysql arrays

我正在制作一个小型的志愿服务系统,在我的志愿服务表中,我有两列用户可以自愿参加活动。

表格如下:

id event_name user_1 user_2 created_at

我希望实现的是当用户自愿参加活动时,会向他提供下一个可用的用户位置。即,如果user_1user_2没有值,并且用户是志愿者,则为他分配第一个可用的插槽(user_1)并且user_id不为空,保存用户user_2列中的ID。

我运行了一个查询,根据事件ID返回user_1user_2列。我遇到的问题是编写PHP代码来选择第一个可用的空数组项,这样我就可以保存用户ID了吗?

希望我有点理解......

由于

1 个答案:

答案 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 byhaving 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个值。