Здесь возможны два подхода, на уровне базы данных, в зависимости от ваших потребностей:
Если есть причина, чтобы сохранить запись в базе данных для каждого появления человека/фруктов (т.е. вам нужно сэкономить время съедания плода и т. д.), тогда нет оснований хранить значение ранга в базе данных, так как для этого потребуется UPDATE
с каждым INSERT
. Вы можете получить ранг с помощью простого запроса, используя COUNT(*)
.
Если нет причин для хранения каждого случая, тогда у вас должна быть только одна запись на комбинацию Person/Fruit со значением ранга, которое обновляется при каждом последующем возникновении.
Ранг Получено с агрегатной функцией
запрос, чтобы получить звание: (Предполагается, что каждый появление хранится в Person_Fruit таблица)
SELECT person, fruit, COUNT(*)
FROM person_fruit
WHERE person = 'the_person'
AND fruit = 'the_fruit'
GROUP BY 1, 2;
Ранг сохраняемого в базе данных
Предполагаемый стол Фрукты (id, person, fruit, rank), с multi-column index на человека и фрукты, поэтому у вас есть только одно появление каждой уникальной комбинации.
До INSERT
/UPDATE
, проверьте, если человек/фрукты уже существует:
SELECT id
FROM fruits
WHERE name = 'the_name' AND fruit = 'the_fruit';
Если это не так, INSERT
Person/Фрукты с рангом значением 1
, так как это первый появление:
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 */
Если это произойдет, UPDATE
ранг:
UPDATE fruits
SET rank = rank +1
WHERE id = id /* You can use id returned from previous `SELECT`, or Person AND Fruit */