Voici deux approches possibles, au niveau de la base de données, selon vos besoins:
S'il y a une raison pour stocker un enregistrement dans la base de données pour chaque occurrence d'une personne/Fruit (par exemple, vous devez enregistrer le temps que le fruit a été mangé, etc), alors il n'y a aucune raison de stocker la valeur du rang dans la base de données, car cela nécessiterait un UPDATE
avec chaque INSERT
. Vous pouvez obtenir le rang avec une requête simple en utilisant COUNT(*)
.
S'il n'y a aucune raison de stocker chaque occurrence, vous ne devriez avoir qu'une entrée par combinaison personne/fruit avec une valeur de rang qui est mise à jour à chaque occurrence suivante.
Rang Récupéré avec fonction d'agrégation
requête pour obtenir le grade: (En supposant chaque occurrence est stocké dans Person_Fruit table)
SELECT person, fruit, COUNT(*)
FROM person_fruit
WHERE person = 'the_person'
AND fruit = 'the_fruit'
GROUP BY 1, 2;
Rang Stored dans la base de données
En supposant table Fruits (id, personne, fruit, rang), avec un multi-column index sur la personne et le fruit, de sorte que vous avez seulement une occurrence de chaque combinaison unique.
Avant INSERT
/UPDATE
, vérifier si la personne/Fruit existe déjà:
SELECT id
FROM fruits
WHERE name = 'the_name' AND fruit = 'the_fruit';
Si elle n'a pas, INSERT
personne/Fruit d'une valeur de rang de 1
, comme cela est le premier occurrence:
INSERT INTO fruits (id, person, fruit, rank)
VALUES (NULL, 'the_person', 'the_fruit', 1); /* NULL should be replaced by auto-generated value, if set up for that */
Si elle le fait, UPDATE
le classement:
UPDATE fruits
SET rank = rank +1
WHERE id = id /* You can use id returned from previous `SELECT`, or Person AND Fruit */