2012-07-02 59 views
1

我有一個基於來自2代不同表的多個記錄插入到表中的一些記錄的多條記錄..插入到表從多個表

表: 目標player_list_items 源1list_items Source2map_details

玩家應該播放一個包含項目列表的列表;列表需要在地圖上播放。

該地圖包含具有其某些X和Y位置的佔位符,我需要將list_items放置在這些佔位符後面。爲此,我創建了包含隨機定位在佔位符後面的list_items的目標表。

以下是我可以將用戶的list_items轉儲到目標表中的查詢,但現在問題是如何從source2表中爲每個list_items隨機獲取X和Y位置。

INSERT INTO player_list_items 
(player_list_list_id, player_list_player_id, player_list_item_id, player_list_item_cellX, player_list_item_cellY) 

SELECT li.list_item_list_id, 584488596, li.list_item_item_id, 2, 5 
FROM list_items li 
WHERE li.list_item_list_id = 2 

任何一個insert with multiple selectseven another query {update}後,這樣的工作對我來說,因爲這將每列表中的用戶只運行一次。

每個列表包含多個項目,因此上述查詢返回多個項目並且其工作正常,需要考慮的是map_details表還包含多個佔位符,並且它們肯定會超過list_items的#號。

所需的查詢應該從map_details表中獲取所有位置X和Y,然後隨機分配給每個單獨項目,每個項目的位置必須是唯一的。

我已經看到了插入多個選擇的例子,但他們是單行插入,我的問題是多個表中的多行,也是隨機的。

I have a Stored Procedure for this case因爲它有很多其他的東西工作正常,如果任何人在這裏想給予答案使用SP將是有用的,而不是一個問題,我使用。

希望上述的東西是有道理的,並澄清我的觀點。

enter image description here

UPDATE

我的第二個查詢:

INSERT INTO player_list_items(player_list_list_id,player_list_player_id,player_list_item_id,player_list_item_cellX,player_list_item_cellY)

SELECT list_item_list_id, 584488596, list_item_item_id, game_map_details.cellX, game_map_details.cellY 
FROM list_items 
JOIN (SELECT * FROM game_map_details WHERE map_id = 1 ORDER BY RAND()) AS game_map_details 
WHERE list_item_list_id = 2 
GROUP BY list_item_item_id 

做這增加了數據從map_details t能,但數據不是隨機的,實際上它從list_items表

enter image description here

問候只插入1對記錄的所有4條記錄

回答

0

我不知道我在下面,但聽起來像你需要的是加入list_itemsmap_details。如果兩個表都有某種始終從一開始並且單調增加而沒有間隙的序列字段,那麼你可以加入它們。鑑於這樣的數據:

Seq Name 
1 Barrel 
2 Box 
3 Crate 

Seq Position 
1 13, 4 
2 99, 2 
3 8, 11 

然後,SELECT I.Name AS ItemName, M.Position FROM Items AS I INNER JOIN Map AS M ON I.Seq = M.Seq會給你:

ItemName Position 
Barrel 13, 4 
Box  99, 2 
Crate 8, 11 

雖然你可能有這樣一個領域,因爲你需要隨機,你將需要至少創建一個新的序列兩個表中的一個,在子查詢中;一個線程here討論瞭如何在MySQL中這樣做。在該線程中,行按特定順序編號,但您可以按GUID或其他隨機元素進行排序,以隨機順序獲取項目。在MS SQL中,我使用ROW_NUMBER(),而Oracle有ROWNUM,但它看起來像MySQL可能不太方便。如果您找到了更好的方法,請將其添加到其他問題中以造福子孫後代。

您將需要通過地圖位置的項的數量之比乘以你的序列號,因此,項目編號跨越地圖的整個數字範圍。一定要計算此比例爲FLOAT,但所得到的數字轉換成INT,使他們正確地加入。例如,如果有四個項目和10個地圖位置,你會隨機排序的項目併爲它們分配數字1,2,3和4;由2.5(地圖位置項的比率)乘以這些,然後輪這些回整數,留給你2(1×2.5,四捨五入到2),5,7,和10。這是不完美的,如這意味着一些地圖位置會比其他地圖更經常出現。如果你隨機地圖位置「」和「」項目的順序,它應該連出。


這裏有一個如何可以這麼寫的說明。假設你正在使用這些項目:

ItemID Name 
42  Barrel 
79  Box 
101 Crate 

...你正在使用這些地圖位置:

MapID Location 
22 13, 4 
38 99, 2 
44 8, 11 
45 7, 10 

開始通過向這些列表指定序列號,如其他說明線程:

ItemID Name Seq 
42  Barrel 1 
79  Box  2 
101 Crate 3 

MapID Location Seq 
22 13, 4 1 
38 99, 2 2 
44 8, 11 3 
45 7, 10 4 
50 1, 12 5 

您現在可以在Items.Seq = Map上加入Items to Map。Seq:

ItemID Name Seq Location 
42  Barrel 1 13, 4 
79  Box  2 99, 2 
101 Crate 3 8, 11 

但是,您總是將您的項目分配給地圖中的第一個元素。要解決這個問題,你可以隨機地圖元素的順序,或者是兩個數值的比率乘以你的項目的序列號(5/3):

ItemID Name Seq NewSeq 
42  Barrel 1 1 * 1.6667 = 1.6667 = 1 
79  Box  2 2 * 1.6667 = 3.3333 = 3 
101 Crate 3 3 * 1.6667 = 5.0000 = 5 

...現在,項目在地圖位置上分佈在1,3和5處,而不是在地圖的起始處聚集。請注意,如果項目列表和地圖列表保持不變,每次都會有相同的位置,因此您最好將隨機序列號分配給您的地圖位置。

+0

@JOAT感謝您的答覆,恐怕你沒有得到實際的場景或我無法解釋..讓我編輯我的問題補充一些例子 – Junaid

+0

我怎麼不明白?再次閱讀您的文章,似乎很清楚您需要什麼:您有一個對象列表,並且您希望將每個對象與另一個列表中的記錄隨機關聯,而且不存在任何一對多關係。爲此,您可以將連續的數字分配給大集合,並將相同範圍的隨機數字分配給小集合。我會在我的答案中給出一個更具體的例子。 – 2012-07-03 19:55:26

0

好,我得到了答案

爲map_details使用遊標,並通過其循環更新項目列表,這裏是代碼以防萬一它可以幫助別人或別人給我一個更好的想法就可以了。

UPDATE player_list_items SET player_list_item_cellX = cell_X, player_list_item_cellY = cell_Y 
      WHERE player_list_id IN (
       SELECT player_list_id FROM (
       SELECT player_list_id FROM player_list_items 
       WHERE player_list_player_id = playerID AND player_list_list_id = @listID AND player_list_item_cellX IS NULL 
       ORDER BY player_list_id LIMIT 1 
       ) tmp 
      );