MySQL: É possível “Inserir se o número de linhas com um valor específico é menor do que X”?
Pergunta
Para dar uma analogia simples, eu tenho uma tabela da seguinte forma:
id (PK) | gift_giver_id (FK) | gift_receiver_id (FK) | gift_date
É possível atualizar a tabela em uma única consulta de tal forma que seria adicionar uma linha (ou seja, um outro presente para uma pessoa) somente se a pessoa tem menos de 10 presentes até agora (ou seja, menos de 10 linhas com o mesmo gift_giver_id)?
O objetivo deste seria limitar o tamanho da tabela para 10 presentes por pessoa.
Agradecemos antecipadamente.
Solução
"E teria que ser também", caso contrário, atualizar os campos na linha mais antiga"?
E teria que ser também, um annendum significativa bastante ensangüentada: P
Eu não faria algo tão complexo em uma única consulta, eu seleccionar primeiro a teste para a mais antiga e, em seguida, atualizar ou inserir em conformidade.
Sem saber o idioma que você está trabalhando em outros de SQL, eu vou ficar com pseudocódigo para partes não-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}
O problema com o seu pedido é que você está tentando encontrar uma única consulta para executar um SELECT, bem como qualquer uma inserção ou uma atualização. Alguém pode muito bem vir e me chamar sobre isso para provar que estou errado, mas eu acho que você está pedindo o impossível, a menos que você quiser entrar em procedimentos armazenados.
Outras dicas
tentar:
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
Eu não sou nenhum guru SQL mas estou pensando algo como o seguinte deve funcionar: (assumindo um nome de tabela de presentes):
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;
[editar] código de formatação não gosta de mim: (