2009-10-12 8 views
0

J'essaie de trouver le moyen le plus efficace de faire quelque chose et j'apprécierais vos conseils!MySQL - deuxième séquence dans le tableau (par exemple par catégorie)

J'ai une table avec les colonnes suivantes:

id 
category 
category_sequence 
other_columns 

id est une colonne auto-incrément et la clé primaire. La catégorie est sélectionnée par l'utilisateur sur l'interface utilisateur.

Ce que je voudrais faire est de générer un category_sequence, ce qui est le plus élevé category_sequence existant pour cette catégorie + 1.

Par exemple, insérer quelques lignes aimeraient comme:

  • 1 , 1, 1
  • 2, 1, 2
  • 3, 2, 1
  • 4, 1, 3

et ainsi de suite.

Évidemment, je pourrais exécuter une requête pour extraire le plus haut category_sequence, en ajouter un, puis exécuter mon instruction d'insertion. Mais y a-t-il un moyen beaucoup plus efficace (certaines des insertions seront dans des boucles assez grandes, donc tout pour l'accélérer, et empêcher le crossover, serait génial).

Merci à l'avance, Kev

+1

Pourquoi ne pouvez-vous pas utiliser 'id' au lieu de' category_sequence'? Cela fonctionnera très bien dans une situation concerte. La seule chose que vous devrez faire est de trier les enregistrements par 'id' et d'ajouter un compteur incrémental du côté de l'application. –

Répondre

1

vous pouvez essayer

insert into mytable 
    select "categoryselected",coalesce(max(category_sequence),0)+1 from mytable where category = "categoryselected" 

Vous pourriez avoir à envelopper dans une déclaration de cas aussi bien dans le cas où il est le premier enregistrement pour cette catégorie. Je n'ai pas mysql pour le tester sur

+0

Super - cela a fonctionné un régal pour moi! La fonction coalesce renvoie 0 s'il s'agit de la première ligne, donc aucune instruction case n'est requise. Merci pour votre aide! – websushi

0

Supposons que vous ayez une table « Catégorie » à quelle catégorie se réfère, vous pourriez avoir un champ next_sequence là-bas. Ayez ensuite un déclencheur d'insertion sur votre table qui tire le numéro de séquence suivant, le place dans la colonne category_sequence, et incrémente le champ next_sequence (il faudrait tout faire en une seule transaction).

+0

N'avait pas pensé à cela comme une option - merci pour votre contribution. – websushi

0

Vous pouvez faire en sorte que la base de données le fasse en changeant votre champ auto_increment pour être category_sequence, puis faites votre catégorie de clé primaire + category_sequence. Vous pouvez ensuite laisser tomber le champ id car il ne va pas faire ce que vous vouliez. MySQL incrémentera alors le champ category_sequence exactement comme vous l'avez décrit.

+0

Merci pour la réponse. Malheureusement, le champ 'id' est nécessaire pour d'autres fonctions du système. – websushi

Questions connexes