2016-02-04 63 views
2

我有一個表:選擇一列,然後插入該列再次隨機

player_id|player_name|play_with_id|play_with_name| 

我做了這個表的遊戲。

每個想玩的人都可以註冊。

當他們註冊的表存儲player_idplayer_name

當,而他們可以註冊期滿我要分配每個player_nameplay_with_name隨機。

因此,例如..我的結構會喜歡這個,當他們在註冊期限:

player_id|player_name|play_with_id|play_with_name| 
1   someone1 
2   someone2 
3   someone3 
4   someone4 
5   someone5 

這期間屆滿時:

player_id|player_name|play_with_id|play_with_name| 

    1  someone1  2    someone2 
    2  someone2  1    someone1 
    3  someone3  4    someone4 
    4  someone4  3    someone3 
    5  someone5  -     - 
+0

爲什麼'someone5'與任何人都不匹配? – Blorgbeard

+0

我想是因爲沒有人離開。玩家1-4已經互相佔據了。 – PerlDuck

+1

您可能更適合在應用程序中隨機分配玩家/「業務層」而不是SQL。爲了防止需要在SQL中執行此操作,我試圖組合一個查詢來執行此操作,但不幸的是,我無法從SQL Fiddle中獲得響應,此刻我也沒有提供MySQL。 –

回答

2

我不能對此進行測試,因爲我沒有一個MySQL數據庫方便和SQLFiddle似乎採取永遠運行任何東西,但這個希望讓你有或至少接近:

SET @row_num = 0; 
SET @last_player_id = 0; 

UPDATE P 
SET 
    play_with_id = 
     CASE 
      WHEN P.player_id = SQ.player_id THEN SQ.last_player_id 
      ELSE player_id 
     END 
FROM 
    Players P 
LEFT OUTER JOIN 
(
    SELECT 
     @row_num := @row_num + 1 row_num, 
     @last_player_id last_player_id, 
     @last_player_id := player_id player_id 
    FROM 
     Players 
    WHERE 
     MOD(@row_num, 2) = 0 
    ORDER BY 
     RAND() 
) SQ ON SQ.player_id = P.player_id OR SQ.last_player_id = P.player_id 

代碼(希望)隨機排列玩家,然後根據該順序將它們配對。隨機排序結果中的每個其他玩家都與之前的人員配對。

在MS SQL Server RAND()只會在這裏一次評估,也不會落得影響ORDER BY,但我認爲 MySQL的處理RAND()不同,產生的結果集中各行的新值。

0

我不知道爲什麼有些客戶端代碼不是這樣做的,而不是在數據庫級完成此操作,但是我想如果你從here獲得基於DB的檢索隨機行集的策略,則可以使用遊標編寫存儲過程或迭代器循環遍歷結果設定的是這樣的:

select player_id, player_name from players order by RAND() 

,然後循環通過所有表中的行,以更新play_with_id和play_with_name,其中所述之前選擇的player_id <> play_with_id。

+0

數據庫在他的問題中標記爲:mysql。 –

+0

啊,就這樣。謝謝。 – Dave

相關問題