MySQL: возможно ли «ВСТАВИТЬ, если число строк с определенным значением меньше X»? - PullRequest
3 голосов
/ 07 января 2010

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

id (PK) | gift_giver_id (FK) | gift_receiver_id (FK) | gift_date

Можно ли обновить таблицу в одном запросе таким образом, чтобы добавить строку (т. Е. Еще один подарок для человека), только если у этого человека меньше 10 подарков (т. Е. Менее 10 строк с тот же gift_giver_id)?

Целью этого было бы ограничение размера стола до 10 подарков на человека.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 07 января 2010

попробуй:

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
2 голосов
/ 07 января 2010

«И будет ли это,« в противном случае, обновить поля в самой старой строке »?»

И это также будет довольно кровавая значительная аннендум: 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. Кто-то может прийти и позвонить мне, чтобы доказать, что я не прав, но я думаю, что вы просите невозможного, если не хотите заниматься хранимыми процедурами.

1 голос
/ 07 января 2010

Я не гуру 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;

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

...