/ / MYSQL: Wie finde ich die Menge der unbestückten Artikel? - PHP, MySQL, zählen

MYSQL: Wie finde ich die Menge der unausgerüsteten Artikel heraus? - PHP, MySQL, zählen

Hier ist meine DB-Struktur:

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 behält den gesamten Artikelbestand mit der Menge bei.
sagen wir, wenn ich 5 Artikel habe (Artikel-ID 123456). dann wird der Eintrag sein (null, $ Benutzer-ID, 123456, 5). Die Menge ist die Menge aller Entitäten mit derselben item_id.

Jedoch können einige Benutzer den Gegenstand ausstatten. Manche nicht. Wenn sie es ausrüsten, wird es ein Eintrag in der UserEquippedItems-Tabelle sein.

Außerdem können Benutzer "Freunde" den Gegenstand des Benutzers auch ausstatten.

Beispieldaten:

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)

Also, wie kann ich die Menge der Artikel herausfinden, die ausgestattet sind? und wie kann ich die Menge der Artikel herausfinden, die NICHT ausgestattet sind?

Nebengeschichte: Vorher haben wir jedes einzelne UserItems als einzelnen Eintrag in der DB. z.B. für item_id = 123123123, wenn ich 5 von ihnen habe, habe ich 5 Einträge in der Datenbank. Aber dann wird unsere Datenbank wie verrückt zu 4 Millionen UserItems-Datensätzen. Deshalb haben wir nur 5 Eintragungen in der UserItems-Tabelle, mit dem Qty-Feld, um zu verfolgen, wie viele insgesamt. Ich weiß nicht, ob es der richtige Ansatz ist, aber ich hoffe, es kann schneiden 75% der DB-Größe runter.

Außerdem war es die Abfrage, die unausgerüsteten Gegenstände zu bekommen:

    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

Natürlich funktioniert diese Abfrage nicht mit dem neuen Schema. :)

Antworten:

1 für die Antwort № 1

Das sollte funktionieren:

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

Um das Unbestückte zu erhalten, können Sie auf Ihrem Client die Anzahl von Qty_Equipped und Qty_Friend_Equipped von Qty subtrahieren.

Eine einzelne Abfrage, die nur unbestückt zurückgibt:

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

Sie könnten diese beiden obigen Abfragen zu einer großen Abfrage zusammenfassen, aber das Image würde die Performance beeinträchtigen, da die Unterabfragen zweimal ausgeführt werden.

Sie können eine WHERE-Klausel am Ende von beiden hinzufügen, um Ergebnisse für einen bestimmten Benutzer / Artikel zurückzugeben.


1 für die Antwort № 2

Um die Gesamtzahl der Gegenstände zu zählen:

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

Um die Gesamtzahl der IDs zu ermitteln $item_id ausgestattet

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

Und um die Gesamtzahl der Elemente Benutzer zu finden $user_id hat ausgestattet (meine erste Antwort, obwohl wahrscheinlich nicht das, was du willst)

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