2017-09-21 1 views
1

Je USER tableau qui a « id » et « name » columns.there est table des produits qui a « id » et « user_id « colonnes ». user_id » colonne a référence clé étrangère « colonne id » dans USER table.when Je l'insertion de plusieurs lignes à l'aide de requêtes SQL unique qui a le même user_id.likegérer plusieurs lignes dans un déclencheur BEFORE INSERT lors de l'insertion de plusieurs lignes par simple requête SQL

INSERT INTO PRODUCT(id,user_id) VALUES(1,1),(2,1),(3,1),(4,1); 

Je veux exécuter avant d'insérer la gâchette pour la poignée en dessous des conditions.

  • Dans la table PRODUCT, obtenez le nombre de lignes ayant les mêmes références de clé étrangère que la clé étrangère des enregistrements d'insertion.
  • si le nombre ci-dessus est supérieur ou égal à trois. Permet d'insérer toutes les lignes.
  • si le nombre ci-dessus est 0 et le nombre de raw qui essayent d'insérer est supérieur ou égal à trois alors permettre d'insérer tous les raws.
  • si le nombre ci-dessus est 0 et le nombre de raw qui essayent d'insérer est inférieur à trois alors ne permettent pas d'insérer tous les raws et envoyer un message d'erreur. Quelqu'un peut-il m'aider à écrire le déclencheur BEFORE INSERT pour gérer toutes ces conditions?

+0

Il semble que la seule chose à vouloir arrêter est quand il y a seulement 1 ou 2 produits connexes existants. Tout ce que vous autorisez à travers. Est-ce exact? –

+0

oui. @ KeithJohnHutchison..please pouvez-vous m'aider avec cela. –

+0

Veuillez ajouter des commandes de schéma et remplir ce schéma avec des exemples de données à votre question. –

Répondre

1

Vous pouvez utiliser la jointure gauche et compter sur les entrées existantes pour n'effectuer que l'insertion d'entrées lorsque 3 enregistrements ou plus sont déjà stockés ou que l'insertion a au moins trois enregistrements à insérer pour un ID utilisateur.

CREATE TABLE if not exists `product_46353892` (
     `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(11) DEFAULT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 

    /* 
     truncate table to allow rerun of example 
     */ 
    truncate product_46353892 ; 

    /* 
     example showing no inserts since there are only two records being inserted 
     and no previous records for this user_id 
     */ 
    insert into product_46353892 (id, user_id) 
    select `new`.* 
    -- , new_count.count new_count 
    -- , old.count old_count 
    from (
     select 1 id, 1 user_id 
     union all 
     select 2 id, 1 user_id 
    ) `new` 
    left join (
     select user_id, count(*) count from (
      select 1 id, 1 user_id 
      union all 
      select 2 id, 1 user_id 
     ) new_group 
     group by user_id 
    ) new_count 
    on `new`.user_id = new_count.user_id 
    left join (
     select user_id, count(*) count from product_46353892 product 
     group by user_id 
    ) old 
    on new.user_id = old.user_id 
    where (new_count.count >= 3 or old.count >= 3 or (new_count.count + old.count) >= 3) ; 


    /* 
     this one works because there are three or more records in the insert 
     */ 
    insert into product_46353892 (id, user_id) 
    select `new`.* 
    from (
     select 3 id, 1 user_id 
     union all 
     select 4 id, 1 user_id 
     union all 
     select 5 id, 1 user_id 
     union all 
     select 6 id, 1 user_id 
    ) `new` 
    left join (
     select user_id, count(*) count from (
      select 3 id, 1 user_id 
      union all 
      select 4 id, 1 user_id 
      union all 
      select 5 id, 1 user_id 
      union all 
      select 6 id, 1 user_id 
     ) new_group 
     group by user_id 
    ) new_count 
    on `new`.user_id = new_count.user_id 
    left join (
     select user_id, count(*) count from product_46353892 product 
     group by user_id 
    ) old 
    on new.user_id = old.user_id 
    where (new_count.count >= 3 or old.count >= 3 or (new_count.count + old.count) >= 3) ; 


    /* 
     this now works since there are already the required number of initial records stored 
     for this user_id 
     */ 
    insert into product_46353892 (id, user_id) 
    select `new`.* 
    -- , new_count.count new_count 
    -- , old.count old_count 
    from (
     select 1 id, 1 user_id 
     union all 
     select 2 id, 1 user_id 
    ) `new` 
    left join (
     select user_id, count(*) count from (
      select 1 id, 1 user_id 
      union all 
      select 2 id, 1 user_id 
     ) new_group 
     group by user_id 
    ) new_count 
    on `new`.user_id = new_count.user_id 
    left join (
     select user_id, count(*) count from product_46353892 product 
     group by user_id 
    ) old 
    on new.user_id = old.user_id 
    where (new_count.count >= 3 or old.count >= 3 or (new_count.count + old.count) >= 3) ; 


    select * from product_46353892 ; 

Exemples de résultats. Notez l'ordre des ID, 1 et 2 a été inséré sur la deuxième insertion après qu'il y avait déjà trois enregistrements ou plus pour l'ID d'utilisateur dans la table.

id user_id 
3 1 
4 1 
5 1 
6 1 
1 1 
2 1 
+0

l'utilisateur de première fois devrait acheter au moins trois produits.après cela.user peut acheter un certain nombre de produits comme il le souhaite. –

+1

Changé la logique pour vérifier 3 ou plus existant ou en cours d'insertion. –