Je crée une table de base de données qui va stocker des liens de menu qui seront finalement apparaître sur une page Web.
Mon problème est que je veux contrôler l'ordre des éléments de menu. Je pourrais avoir un champ appelé ordre mais chaque fois que je dispose d'un nouveau lien de menu, je devrais insérer la commande et modifier tous les enregistrements avec une commande supérieure à +1. P>
Par exemple, disons que je veux que je veux le Liens (dans cet ordre): P>
Name Order Home 1 About 2 Products 3 Shopping 4
5 Réponses :
Sans commande par, vous ne pouvez pas garantir l'ordre des données - généralement, sans ordre de celui-ci sera basé sur une ordonnance d'insertion.
Malheureusement, il n'y a pas de convention qui fonctionne bien pour un ordre de tri personnalisable de l'utilisateur .
On pourrait s'en tirer avec des fonctions d'analyse / fenêtres / classement comme Row_Number, mais cela dépend de la prise en charge des données et de la base de données (MySQL ne prend pas en charge les fonctions analytiques, Oracle 9i + / PostgreSQL 8.4 + / SQL Server 2005+ DO). Mais les fonctions analytiques ne vous aident pas si vous souhaitez une entrée commençant par "B" pour apparaître avant "A" / etc. P>
Vos options sont d'utiliser deux instructions pour insérer un enregistrement unique: P > ... ou supprimez les enregistrements existants et réinsérez la liste dans la nouvelle commande. p> p>
Je pense que cela est lié au problème général de l'utilisation d'un tableau VS une liste liée. Que diriez-vous de stocker une clé étrangère faisant référence à l'enregistrement suivant dans la même table? Ceci est la liste liée comme une approche.
Pour votre exemple, il n'y a pas trop d'onglets, une approche basée sur une matrice devrait donc fonctionner correctement. Mais pour une personne ayant des centaines d'enregistrements, il peut être utile d'utiliser une clé étrangère auto-référentielle. P>
ID Name NExT 1 Home 5 2 About 3 3 Products 4 4 Shopping NULL 5 Contact us 2
Le problème ici est qu'il ne résout pas le problème. faire un changement nécessite que vous mettriez à jour tous les enregistrements> cette ligne
Personne ne change ne vous oblige pas à mettre à jour toutes les lignes. Si vous ajoutez, contactez-nous après la maison, la table aimerait comme indiqué. Mise à jour de la réponse.
Mais vous mettez à jour la colonne suivante de chaque enregistrement. . Je ne comprends pas pourquoi vous dites que vous ne mettez pas à jour toutes les lignes
Non, je ne mettez pas à jour tous les enregistrements. Notez que seules les lignes avec ID 1 et 5 sont mises à jour dans l'exemple. Les lignes 2, environ, 3 code>,
3, produits, 4 code> et
4, shopping, null code> ne sont pas mis à jour dans l'exemple ci-dessus. Pensez en termes de liste liée et d'insert de tableau.
@leora fait ma mise à jour répondre à votre question? Y a-t-il des doutes que vous avez besoin de moi pour clarifier?
Ouais . . logique . . cherchait trop vite avant: 0
Comment pouvez-vous écrire une requête qui commande la table correctement? Il semble qu'il n'y ait pas un simple (un qui n'est pas récursif).
Oui, @rohitbanga, allez-y et essayez de trier ceci :)
Vous devez considérer que lorsque vous utilisez une liste liée, alors lorsque vous souhaitez réorganiser l'un des éléments, vous devez également mettre à jour les autres enregistrements et que cela doit être effectué dans une transaction qui n'est pas rapide du tout. (Vous Besoin de transaction car toutes les mises à jour doivent être effectuées complètement ou aucune d'entre elles ne doivent être mises à jour) Les lignes avec un nombre plus petit sont au début de la liste et la ligne avec le plus grand nombre sera le dernier élément de votre liste.
Maintenant ici, voici l'astuce, si vous vouliez réorganiser les produits et maintenant, vous pouvez désormais trier la liste finale, en fonction du champ Numéro Strong> P> P> P>
Il y a une autre solution pour ce problème qui fonctionne sur
Pour utiliser cette méthode, vous donnez à chacun de vos enregistrements un numéro. Par exemple:
La maison
Une meilleure solution consiste à créer une matrice de vos identifiants d'éléments dans l'ordre et à le tourner dans un tableau JSON et de le stocker en tant que fichier ou dans une table ou où vous le souhaitez. Vous pouvez ensuite extraire vos objets dans la base de données et mapper votre tableau dans une liste d'éléments. Vous continuez d'un côté dans la commande et, de l'autre, les données. Si vous supprimez un élément de la base de données, vous pouvez supprimer des éléments de votre mappage de votre réseau. Si vous ajoutez un nouvel élément à la base de données, vous devez les ajouter à votre tableau aussi, mais si vous ne le faites pas, rien n'est cassé. P>
longue histoire courte: p>
Vous pouvez ajouter 2 colonnes (après, avant) Par exemple, contactez-nous est après la maison et avant, si vous souhaitez ajouter un nouveau lien entre nous contacter et chez vous, vous devez simplement modifier 3 enregistrements. Maisons avant la colonne ne change à (nouveau nom de lien), Ensuite, vous insérez un nouveau lien puis contactez-nous après des modifications de colonne (nouveau nom de lien). Désolé je ne suis pas bon en anglais. P>