2010-01-07 10 views
3

Pour donner une analogie simple, j'ai un tableau comme suit:MySQL: Est-il possible de "INSERT si le nombre de lignes avec une valeur spécifique est inférieur à X"?

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

Est-il possible de mettre à jour le tableau dans une seule requête de manière à ajouter une ligne (un autre cadeau pour une personne) seulement si la personne a moins de 10 cadeaux jusqu'à présent (moins de 10 lignes avec le même gift_giver_id)?

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

Merci d'avance.

+0

Et que ce serait aussi, «sinon, mettez à jour les champs de la plus ancienne ligne? – Don

+0

Umm ... pas le plus ancien dans ce cas, mais plutôt la date du cadeau pour la même paire donneur/receveur. Donc, d'une certaine façon, la date reflète le dernier cadeau entre les deux, mais en maintenant max 10 cadeaux. En vérité, ce qui précède est une simplification. La clé primaire réelle est une combinaison VARCHAR d'ID donneur/récepteur et il n'y a pas de clé primaire INT. Deux colonnes seulement. – Tom

Répondre

2

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

Et ce serait aussi, un annendum significatif plutôt sanglant: P

Je ne ferais pas quelque chose de si complexe dans une seule requête, je choisirais d'abord de tester pour le plus ancien, puis de 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. Il se peut que quelqu'un vienne m'appeler pour me prouver le contraire, mais je pense que vous demandez l'impossible, à moins que vous ne vouliez entrer dans des procédures stockées.

+0

Merci, oui, j'ai commencé à penser dans ce sens après avoir posté la question. J'utilise PHP, et le séparer en deux parties est logique, car j'ai besoin d'attacher d'autres actions à la situation où il y a déjà 10 cadeaux (c'est-à-dire dire à l'utilisateur, etc.). Par conséquent, je vais choisir ceci comme réponse acceptée. – Tom

2

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 
1

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; 

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