这是我的数据库结构:
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
当然,此查询不适用于新架构。 :)
答案 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子句,以返回特定用户/项的结果。