代码之家  ›  专栏  ›  技术社区  ›  murvinlai

MySQL:如何找到未装备的数量?

  •  1
  • murvinlai  · 技术社区  · 14 年前

    这是我的数据库结构:

    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)。然后输入 (空,$userid,123456,5)。 数量是具有相同项目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)
    

    那么,我如何才能找出装备的数量呢? 我怎样才能找出没有装备的物品的数量呢?

    旁白:在前面,我们将每个单独的用户项作为数据库中的一个条目。例如,对于项目_id=123123123,如果我有5个条目,我在数据库中有5个条目。但是,我们的数据库疯狂地增长到400万个用户项目记录。这就是为什么我们没有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
    

    当然,这个查询不适用于新的模式。:)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Cameron    14 年前

    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 
    

    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
  •  1
  •   Chadwick    14 年前

    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