MySQL: Est-il possible de « INSERT si le nombre de lignes avec une valeur spécifique est inférieure à X »?

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

  •  19-09-2019
  •  | 
  •  

Question

Pour donner une analogie simple, j'ai une table comme suit:

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

Est-il possible de mettre à jour la table dans une seule requête de telle manière qui ajouterait une ligne (c.-à-un autre cadeau pour une personne) que si la personne a moins de 10 cadeaux à ce jour (soit moins de 10 lignes avec la même gift_giver_id)?

Le but de ce serait de limiter la taille de la table à 10 cadeaux par personne.

Merci d'avance.

Était-ce utile?

La solution

« Et serait-il également,« sinon, mettez à jour les champs de la plus ancienne ligne? »

Et serait-il également, une importante annendum plutôt sanglante: P

Je ne voudrais pas faire quelque chose qui complexe dans une seule requête, je choisis d'abord pour tester le plus ancien, puis mettre à jour ou insérer en conséquence.

Ne sachant pas quelle langue vous travaillez dans autre que SQL, je vais en tenir à des parties non pseudocode-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}

Le problème avec votre demande est que vous essayez de trouver une seule requête pour effectuer une commande SELECT ainsi que soit un INSERT ou UPDATE. Quelqu'un pourrait bien venir et appelez-moi sur cela pour me prouver mais je pense que vous demandez l'impossible à moins que vous voulez entrer dans des procédures stockées.

Autres conseils

essayer:

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

Je ne suis pas gourou SQL mais je pense quelque chose comme ce qui suit devrait fonctionner: (en supposant un nom de table de cadeaux):

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;

code [modifier] la mise en forme ne me aime pas: (

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top