MySQL:Можно ли «ВСТАВИТЬ, если количество строк с определенным значением меньше X»?

StackOverflow https://stackoverflow.com/questions/2018354

  •  19-09-2019
  •  | 
  •  

Вопрос

Если провести простую аналогию, у меня есть следующая таблица:

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;

[править] Форматирование кода мне не нравится :(

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top