2010-09-16 61 views
1

這裏是我的數據庫結構:MYSQL:如何找出未裝備物品的數量?

CREATE TABLE IF NOT EXISTS `UserItems` (
    `id` bigint(20) unsigned NOT NULL auto_increment, 
    `user_id` int(10) unsigned NOT NULL, 
    `item_id` int(10) unsigned NOT NULL, 
    `qty` int(11) NOT NULL default '0' 
) ; 



CREATE TABLE IF NOT EXISTS `UserEquippedItems` (
    `user_id` int(10) unsigned NOT NULL, 
    `user_item_id` bigint(20) unsigned NOT NULL 
); 


CREATE TABLE IF NOT EXISTS `UserFriendEquippedItems` (
    `user_friend_id` int(10) unsigned NOT NULL, 
    `user_item_id` bigint(20) unsigned NOT NULL 
); 

UserItems保持所有的項目清單與數量。
讓我說如果我有5個項目(項目ID 123456)。那麼該條目將是 (null,$ userid,123456,5)。 數量是具有相同item_id的所有實體的數量。

但是,有些用戶可能會裝備該項目。有些不。如果他們裝備它,它將成爲UserEquippedItems表中的一個條目。

此外,用戶的朋友也可以裝備用戶的物品。

樣本數據:

UserItems: 
id, user_id, item_id, qty 
(1, 4567, 123123123, 5) 
(2, 4567, 100010001, 2) 
(3, 4567, 100010099, 1) 


UserEquippedItems: (user_item_id is UserItems.id) 
user_id, user_item_id 
(4567, 1) 
(4567, 2) 

UserFriendEquippedItems 
(user_item_id is UserItems.id) 
user_friend_id, user_item_id 
(4100, 1) 
(4100, 3) 

所以,我怎麼能找到裝備的項目的數量是多少? 以及如何找出未裝備的物品數量?

Side Story:之前,我們將每個單獨的UserItems作爲數據庫中的單個條目。例如對於item_id = 123123123,如果我有5個,我有5個條目在數據庫中。但隨後,我們的數據庫瘋狂地增長到了400萬個UserItems記錄。這就是爲什麼而不是有5個條目的原因,我們在UserItems表中只有一個條目,其中的qty字段用於跟蹤總共多少個條目。我不知道這是否是正確的方法,但我希望它可以減少75%的數據庫大小。

而且,它是查詢來獲取裝載的物品:

SELECT Items.id, count(UserItems.id) as numCount 
FROM UserItems INNER JOIN 
Items ON UserItems.active=1 AND 
UserItems.item_id=Items.id AND 
Items.active=1 AND 
UserItems.user_id=$userId 
WHERE NOT EXISTS ( 
SELECT UserEquippedItems.user_item_id 
FROM UserEquippedItems 
WHERE UserEquippedItems.user_item_id= UserItems.id 
) 
AND NOT EXISTS ( 
SELECT UserFriendsEquippedItems.user_item_id 
FROM UserFriendsEquippedItems 
WHERE UserFriendsEquippedItems.user_item_id= UserItems.id) 
GROUP BY Items.id 

當然,這查詢不使用新模式工作。 :)

+0

由於您添加了'UserItems.qty'字段,所以在'...EquippedItems'表中只有1個裝備(* n *擁有)?我是這麼認爲的,否則每個數字都是5,你的例子裝備了第1項中的10個!如果'...... EquippedItems'只意味着一個單獨的項目,那麼你需要'count(*)'語義,否則在''中有'sum(qty)'...和可能'qty'字段的東西。 .EquippedItem'表,因此用戶和他的朋友不能同時裝備相同的5個物品(例如上面的物品1!)。 – Chadwick 2010-09-16 02:50:08

回答

1

這應該工作:

SELECT id, user_id, item_id, qty, 
    (SELECT COUNT(*) FROM UserEquippedItems uei 
     WHERE uei.user_item_id=ui.id) as qty_equipped, 
    (SELECT COUNT(*) FROM UserFriendEquippedItems ufei 
     WHERE ufei.user_item_id=ui.id) as qty_friend_equipped 
FROM UserItems ui 

然後拿到未裝備,你的客戶端就可以減去qty_equipped和數量qty_friend_equipped。

只返回裝載的一個查詢:

SELECT id, user_id, item_id, qty, 
    qty- 
     (SELECT COUNT(*) FROM UserEquippedItems uei 
      WHERE uei.user_item_id=ui.id)- 
     (SELECT COUNT(*) FROM UserFriendEquippedItems ufei 
      WHERE ufei.user_item_id=ui.id) 
    as qty_unequipped 
FROM UserItems ui 

你可以與2個查詢組合上述成一個大的查詢,但我形象,會傷害性能,因爲它會運行子查詢的兩倍。

您可以在兩者的末尾添加WHERE子句以返回特定用戶/項目的結果。

+0

謝謝。我測試了一下。我工作。非常感謝。 :) – murvinlai 2010-09-16 19:40:15

1

要計算項目的總數量配備:

SELECT count(*) FROM UserEquippedItems e JOIN UserItems i ON (i.id = e.user_item_id) 

要查找的總數配備ID $item_id的項目

SELECT count(*) FROM UserEquippedItems e WHERE e.user_item_id = $item_id 

,並找到項的用戶$user_id總數已裝備(我的第一反應,雖然可能不是你所追求的)

SELECT count(*) FROM UserEquippedItems WHERE user_id = $user_id 
+0

你能幫我再次看看這個問題嗎?我剛剛添加了更多信息。 – murvinlai 2010-09-16 03:00:24