Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL:如何查找未装备物品的数量?_Php_Mysql_Count - Fatal编程技术网

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

Php MYSQL:如何查找未装备物品的数量?,php,mysql,count,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 EXI

以下是我的数据库结构:

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)。 数量是具有相同物料id的所有实体的数量

但是,有些用户可能会装备该物品。有些则不然。如果他们装备了它,它将成为UserEquipItems表中的一个条目

此外,用户的朋友也可以装备用户的物品

样本数据:

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)
那么,我怎样才能知道装备的物品数量呢? 我怎样才能知道没有装备的物品的数量

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

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

要计算装备的物品总数:

SELECT count(*) FROM UserEquippedItems e JOIN UserItems i ON (i.id = e.user_item_id)
查找id
$item\u id
装备的项目总数

SELECT count(*) FROM UserEquippedItems e WHERE e.user_item_id = $item_id
以及查找用户
$user\u id
配备的物品总数(我的第一个响应,但可能不是您想要的)

这应该起作用:

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 count(*) FROM UserEquippedItems e JOIN UserItems i ON (i.id = e.user_item_id)
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子句,以返回特定用户/项目的结果

既然您添加了
UserItems.qty
字段,那么
…equipeItems
表中的条目是否仅表示配备了1件物品(共n件)?我假设是这样,否则每一个都是5,你的例子就装备了第1项中的10个!如果
…equipmedItems
仅表示装备了单个项目,那么您将需要
计数(*)
语义,否则使用
总和(数量)
。。。您的
…equipeItem
表中可能有
quantity
字段,因此用户和他的朋友不能同时装备相同的5个项目(例如上面的项目1!)。您能帮我再次查看问题吗?我刚刚补充了更多的信息。