MYSQL:如何找出未装备物品的数量?

时间:2010-09-16 01:43:29

标签: php mysql count

这是我的数据库结构:

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)。 qty是具有相同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作为DB中的单个条目。例如对于item_id = 123123123,如果我有5个,我在数据库中有5个条目。但是,我们的数据库变得疯狂到400万UserItems记录。这就是为什么我们在UserItems表中只有一个条目而不是有5个条目,而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

当然,此查询不适用于新架构。 :)

2 个答案:

答案 0 :(得分:1)

计算配备的物品总数:

SELECT count(*) FROM UserEquippedItems e JOIN UserItems i ON (i.id = e.user_item_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

答案 1 :(得分: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中减去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 

你可以将上面的这两个查询合并到一个大查询中,但我想象会损害性能,因为它会运行两次子查询。

您可以在这两个子句的末尾添加WHERE子句,以返回特定用户/项的结果。