/ / MYSQL: Ako zistiť počet nevybavených položiek? php, mysql, count

MYSQL: Ako zistiť množstvo nevybavených položiek? php, mysql, count

Tu je môj DB štruktúra:

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 uchováva všetky položky zásob s množstvom.
povedzme, ak mám 5 položiek (číslo položky 123456). potom bude zadaný údaj (null, $ userid, 123456, 5). qty je množstvo celej entity s rovnakým item_id.

Niektorí používatelia však môžu túto položku vybaviť. Niektoré nie. Ak ich vybavia, bude to záznam v tabuľke UserEquippedItems.

Priatelia používatelia môžu tiež vybaviť položku používateľa.

Ukážkové údaje:

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)

Ako môžem zistiť množstvo vybavených položiek? a ako môžem zistiť množstvo položiek, ktoré NIE sú vybavené?

Bočný príbeh: Predtým máme každý jednotlivý UserItems ako jeden záznam v DB. napr. pre item_id = 123123123, ak mám 5 z nich, mám 5 položiek v DB. Ale potom náš DB rastie ako blázon až na 4 milióny záznamov UserItems. to je dôvod, prečo namiesto toho, aby sme mali 5 záznamov, máme iba jednu položku v tabuľke UserItems s množstvom poľa pre sledovanie toho koľko celkom Neviem, či je to správny prístup, ale dúfam, že to môže znížiť zníženie o 75% veľkosti DB.

Tiež bol dotaz dostať nevybavené položky:

    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

Samozrejme, tento dotaz nefunguje s novým schémou.

odpovede:

1 pre odpoveď č. 1

Toto by malo fungovať:

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

Potom, aby ste dostali nevybavené, na vašom klientovi môžete odčítať qty_equipped a qty_friend_equipped od qty.

Jediný dopyt, ktorý sa práve vráti:

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

Môžete skombinovať tieto 2 dopyty vyššie do jedného veľkého dopytu, ale obrázok, ktorý by poškodil výkonnosť, pretože bude spúšťať podreťazenia dvakrát.

Môžete pridať klauzulu WHERE na konci obidvoch, aby sa vrátili výsledky pre konkrétneho používateľa / položku.


1 pre odpoveď č. 2

Ak chcete počítať celkový počet vybavených položiek:

SELECT count(*) FROM UserEquippedItems e JOIN UserItems i ON (i.id = e.user_item_id)

Ak chcete zistiť celkový počet položiek id $item_id vybavený

SELECT count(*) FROM UserEquippedItems e WHERE e.user_item_id = $item_id

A nájsť celkový počet používateľov položiek $user_id (prvú odpoveď, aj keď pravdepodobne nie ste to, čo ste po tom)

SELECT count(*) FROM UserEquippedItems WHERE user_id = $user_id