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!)。您能帮我再次查看问题吗?我刚刚补充了更多的信息。