У меня есть таблица, которая содержит 4 столбца
id | category | score | enabled
1 | news | 95 | t
id
- серийный
category
- varchar
score
- float
enabled
- bool
Я хочу обновить enabled
до False
, если есть другая запись с более высоким счетом.
Например, если у меня есть:
id | category | score | enabled
1 | news | 95 | t
Затем, после некоторой операции, добавляется новая запись с той же категорией:
id | category | score | enabled
1 | news | 95 | t
2 | news | 100 | f
Поскольку оценка для id=2
выше, я хочу изменить enabled
для id=2
на True
и изменение enabled
для id=1
на False
.
Мне интересно, могу ли я объединить эти операции в 1 запрос.Прямо сейчас я делаю 2 SELECT
запросов, чтобы получить 2 записи, затем сравниваю результаты локально, а затем изменяю значение enabled
(если необходимо).
Так просто,
SELECT id, score
FROM table
WHERE category = %s
AND enabled = True
SELECT id, score
FROM table
WHERE category = %s
AND id = (SELECT max(id) WHERE category=%s)
if score2>= score1:
UPDATE table SET enabled = True
WHERE id = id2
UPDATE table SET enabled = False
WHERE id = id1
Это работает, но кажется очень неэффективным.Есть ли способ улучшить эти запросы?