MySQL: É possível “Inserir se o número de linhas com um valor específico é menor do que X”?

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

  •  19-09-2019
  •  | 
  •  

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.

Foi útil?

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: (

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top