Je voudrais savoir s'il est possible de simplifier le processus suivant: Je veux marquer un jeu pour l'expédition à un client basé sur les critères suivants: (Si vous êtes familier avec Netflix, c'est l'équivalent de leur file d'attente de films.)J'ai besoin de conseils sur la façon de simplifier/améliorer un modèle de commande dans mysql
- Combien de jeux ils ont à la maison.
- Combien de jeux ont-ils reçus au total pour leur mois de facturation?
J'ai une table qui stocke les choix des clients (leur file d'attente de jeux) appelés listes de souhaits. J'utilise la requête suivante pour classer automatiquement leurs choix pour les enregistrements nouvellement insérés (rang détermine la priorité d'expédition):
schema (id, memberId, gameId, rank, markedForShipment, shippedOn, returnedOn)
INSERT INTO wishlists (memberId, gameId, rank, markedForShipment)
SELECT @memberId, @gameId, COALESCE(MAX(rank), 0) + 1, 0, null, null
FROM wishlists
WHERE wishlists.memberId = @memberId
Je voudrais remplir automatiquement « markedForShipment » avec un 0 ou un 1 sur la base deux critères: 1. How many games a member has already received this month
et 2. how many games a member currently has at home
en ce moment je fais ce qui suit après chaque insertion:
Grab les limites du plan d'une table de plans (shipmentsPerMonthLimit et gamesAtHomeLimit).
Découvrez combien d'expéditions (
shipmentCount
) un membre a eu ce mois-ciSELECT COUNT(shippedOn) AS shipmentCount FROM wishlists INNER JOIN members ON wishlists.memberId = members.id WHERE wishlists.memberId = @memberId AND wishlists.shippedOn >= members.billingCycleStart AND wishlists.shippedOn < DATE_ADD(members.billingCycleStart, INTERVAL 1 MONTH)
Découvrez combien
gamesAtHome
un membre aSELECT COUNT(shippedOn) AS gamesAtHome FROM wishlists WHERE memberId = @memberId AND shippedOn IS NOT NULL AND returnedOn IS NULL
Découvrez combien de livraisons en attente (
markedForShippment
) un membre aSELECT COUNT(markedForShippment) AS queuedShipments FROM wishlists WHERE memberId = @memberId AND markedForShipping = 1
Vérifiez pour voir si le jeu est en stock.
Si tout ce qui suit est vrai que je mets à jour l'enregistrement nouvellement inséré par la mise markedForShipping to 1
.
gamesAtHome is < than gamesAtHomeLimit
shipmentCount is < than shipmentsPerMonthLimit
queuedShipments is < gamesAtHomeLimit
Comment puis-je améliorer ce processus? Puis-je le simplifier? Je pose ces questions en gardant à l'esprit que la performance est probablement le facteur le plus important. 4.
Je suis d'accord avec cette réponse. À moins que vous n'ayez des problèmes particuliers à poser, il est difficile de faire des commentaires. Vous pouvez bien sûr fusionner quelques-unes de ces requêtes, mais que vous en tiriez beaucoup ou pas, cela dépend un peu de la manière dont vous lancez les requêtes et ainsi de suite ... – andy
Merci les gars!Ma seule préoccupation est que les gens vont ajouter des choses à leurs listes tout le temps, donc il semble que beaucoup de requêtes se passe à chaque fois que quelqu'un ajoute quelque chose à leur liste ... Andy, comment consolideriez-vous certaines de ces requêtes? – Mohamad
Toutes les idées que j'avais pour fusionner n'ont pas fonctionné. Vous pouvez tout faire dans une procédure stockée, cela réduira la communication avec la couche de base de données. – Cephalopod