MySQL:Можно ли «ВСТАВИТЬ, если количество строк с определенным значением меньше X»?
Вопрос
Если провести простую аналогию, у меня есть следующая таблица:
ID (PK) | Gift_giver_id (fk) | Gift_receiver_id (fk) | Gift_date
Можно ли обновить таблицу в одном запросе таким образом, чтобы добавить строку (т.е.еще один подарок для человека) только в том случае, если у человека на данный момент имеется менее 10 подарков (т.е.менее 10 строк с одинаковым Gift_giver_id)?
Целью этого будет ограничение размера стола до 10 подарков на человека.
Заранее спасибо.
Решение
«И это тоже будет: «Иначе обновите поля в самой старой строке»?»
И это тоже будет довольно кроваво-значимым событием :P
Я бы не стал делать что-то настолько сложное в одном запросе, я бы сначала выбрал проверку самого старого, а затем либо обновил, либо вставил соответственно.
Не зная, на каком языке вы работаете, кроме SQL, я просто буду придерживаться псевдокода для частей, не связанных с SQL.
SELECT TOP 1 id FROM gifts
WHERE (SELECT COUNT(*) FROM gifts WHERE gift_giver_id = senderidvalue
ORDER BY gift_date ASC) > 9;
{if result.row_count then}
INSERT INTO gifts (gift_giver_id, gift_receiver_id,gift_date)
VALUES val1,val2,val3
{else}
UPDATE gifts SET gift_giver_id = 'val1',
gift_receiver_id = 'val2',gift_date = 'val3'
WHERE {id = result.first_row.id}
Проблема с вашим запросом заключается в том, что вы пытаетесь найти один запрос для выполнения SELECT, а также INSERT или UPDATE.Кто-то вполне может прийти и позвонить мне по этому поводу, чтобы доказать, что я не прав, но я думаю, что вы просите невозможного, если только вы не хотите заняться хранимыми процедурами.
Другие советы
пытаться:
insert into tablename
(gift_giver_id, gift_receiver_id, gift_date)
select GIVER_ID, RECEIVER_ID, DATE from Dual where
(select count(*) from tablename where gift_receiver_id = RECEIVER_ID) < 10
Я не гуру SQL, но думаю, что должно работать что-то вроде следующего:(предполагая табличное название подарков):
INSERT INTO gifts (gift_giver_id, gift_receiver_id,gift_date)
SELECT DISTINCT senderidvalue,receiveridvalue,datevalue FROM gifts
WHERE (SELECT COUNT(*) FROM gifts WHERE gift_giver_id = senderidvalue ) < 10;
[править] Форматирование кода мне не нравится :(