2015-05-15 39 views
-2

我有一個小型的志願服務系統,在我的志願工作表中,我有2個列,用戶可以自願參加一個活動。在數組中獲得第一個可用的空值

表看起來像這樣:

id event_name user_1 user_2 created_at 

我想實現當事件的用戶名志願者,下一個可用的用戶插槽給他的。也就是說,如果user_1user_2沒有值,並且用戶志願者,給他分配第一個可用插槽(user_1)並且user_id不爲空,則將用戶標識保存在user_2列中。

我已經運行了一個查詢,根據事件ID返回user_1user_2列。問題我正在寫的PHP代碼來選擇第一個可用的空數組項目,所以我可以保存用戶ID?

希望我是那種決策意識..

感謝

+0

安置自己的預計結果表模式 –

+0

事件表架構 ID NOT NULL AUTO_INCREMENT EVENT_NAME VARCHAR(50) USER_1 INT(11)NOT NULL user_2 INT(11)NOT NULL created_at DATETIME – user2011139

+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,如果沒有該活動的志願者,您將在ev.user_id中獲得null值。

+1

謝謝,這可能會簡化很多事情... – user2011139

相關問題