2017-02-14 2 views
0

У меня есть таблица в базе данных MySQL, к которой записи добавляются непрерывно. Я хочу ранжировать возникновение значения и сохранить его в новом поле.Mysql - ранжирование на основе возникновения значения

Я хочу заполнить поле FruitRank, основанное на появлении фруктов, для этого конкретного лица/имени.

Вот ожидаемая таблица - имя и фрукты добавляются в таблицу в реальном времени. Поле FruitRank должно быть рассчитано и обновлено в режиме реального времени. Как это сделать?

Наименование | Фрукты | FruitRank (новое поле)

Amy | яблоко | 1

Эми | яблоко | 1

Эми | яблоко | 1

Эми | оранжевый | 2

Эми | оранжевый | 2

Tom | виноград | 1

Tom | виноград | 1

Эми | киви | 3

Эми | киви | 3

ответ

0

Вы можете написать триггер AFTER INSERT по текущей таблице, который вычисляет ранг плода и вставляет записи в другую таблицу. Вы можете использовать следующий запрос, чтобы вычислить ранг:

SELECT COUNT(*) into rank 
FROM table 
WHERE person NEW.person and fruit = NEW.fruit; 

После того, как вы получите ранг, вы можете выполнить INSERT запрос для вставки записи в другую таблицу.

Here пример AFTER INSERT триггер.

0

Из ваших данных образца (единственный доступный способ как-то определить, какую структуру таблицы вы имеете в виду) Непонятно, почему вы должны сохранять разные записи с абсолютно одинаковой полезной нагрузкой.

Это в основном кажется, что единственное, что вы обновляете - это ранг.

Так что в этом случае ранг приходит естественно с обновлениями, как (а не вставки):

UPDATE fruitRanks SET FruitRank=FruitRank+1 WHERE Fruit = 'apple' AND Name='Amy'; 

Если у вас есть разница в ваших полезных нагрузках - то используйте отдельную таблицу (в сочетании с после обновления триггер), тогда нет необходимости сохранять Ранг в каждой строке.

Или просто оставьте поле и вычислите его, когда вам это нужно, сгруппировав & Функция агрегации.

0

Здесь возможны два подхода, на уровне базы данных, в зависимости от ваших потребностей:

  • Если есть причина, чтобы сохранить запись в базе данных для каждого появления человека/фруктов (т.е. вам нужно сэкономить время съедания плода и т. д.), тогда нет оснований хранить значение ранга в базе данных, так как для этого потребуется 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 */ 
Смежные вопросы