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