Comment puis-je réorganiser les lignes dans la base de données sql
Est-il possible de réorganiser les lignes dans la base de données SQL?
Par exemple, comment puis-je inverser l'ordre de la 2e rangée et 3e rangée de valeurs?
L'ordre de la ligne est important pour moi car j'ai besoin d'afficher la valeur en fonction de la commande.
Merci pour toutes les réponses. Mais "trier par" ne fonctionne pas pour moi.
Par exemple, j'ai mis une liste de signets dans la base de données.
Je veux afficher en fonction du résultat que je l'obtenir à partir d'une requête. (pas dans l'ordre de l'alphabet). Juste au moment où ils sont insérés.
Mais l'utilisateur peut les réorganiser la position du signet (de toute façon, il/elle veut). Donc je ne peux pas utiliser "trier par".
Un exemple est la façon dont le signet d'affichage dans le signet dans le navigateur firefox. Utilisateur peut changer de position facilement. Comment puis-je mentionner que dans la DB?
Merci.
Vous devez vous connecter pour publier un commentaire.
Il semble que vous ayez besoin d'une autre colonne comme "ListOrder". Si votre table pourrait ressembler à:
Ensuite, vous pouvez "order by" ListOrder.
Si l'utilisateur ne peut déplacer un signet un endroit à la fois, vous pouvez utiliser des nombres entiers comme le ListOrder, et les échanger. Par exemple, si l'utilisateur veut aller "f" jusqu'à une ligne:
Si l'utilisateur peut déplacer un signet vers le haut ou vers le bas, le nombre de lignes à la fois, alors vous devez modifier la position d'un segment. Par exemple, si l'utilisateur veut aller "f" en haut de la liste, vous devez:
UPDATE
requêtes en 1 opération (le niveau d'isolation).Comme d'autres l'ont mentionné, il n'est pas une bonne idée de dépendre sur le physique de commande de la table de base de données. Tables relationnelles sont conceptuellement plus comme non ordonnée des ensembles de listes ordonnées. En supposant un certain ordre physique peut conduire à des résultats imprévisibles.
Ressemble à ce que vous avez besoin est une colonne distincte que les magasins préférés de l'utilisateur ordre de tri. Mais vous aurez toujours besoin de faire quelque chose dans votre requête pour afficher les résultats dans l'ordre.
Il est possible de spécifier l'ordre physique des enregistrements dans une base de données en créant un index cluster, mais ce n'est pas quelque chose que vous aimeriez faire sur un arbitraire défini par l'utilisateur de base. Et elle peut encore conduire à des résultats inattendus.
Utilisation
ORDER BY
dans votreSELECT
requête. Par exemple, à l'ordre par un utilisateur du nom de famille, utilisation:L'ordre des lignes dans la base de données ne devrait pas d'importance.
Vous devez utiliser le
ORDER BY
clause dans vos requêtes de la façon dont vous avez besoin.Bases de données peut stocker les données de quelque manière qu'ils veulent. À l'aide de la "commande par" clause est le seulement façon de garantir un classement des données. Dans votre signet exemple, vous pourriez avoir un champ de type entier qui indique la commande, et ensuite mettre à jour ce champ en tant que l'utilisateur déplace les choses autour. Puis l'ORDRE PAR rapport à cette colonne pour obtenir les choses dans le bon ordre.
Je suppose qu'un simple
order by
serait ce que vous recherchez?Que d'autres ont déclaré que l'utilisation d'une commande par.
Ne jamais dépendre de l'ordre des données dans une table physique, toujours de la base de données que vous travaillez, que ce soit sur un ou plusieurs domaines clés.
J'ai une solution pour ce que j'ai utilisé quelques fois. Je garde un champ supplémentaire "sort_order" dans le tableau, et les mettre à jour lors de la réorganisation. J'ai utilisé ce dans les cas où j'ai une sorte de conteneurs avec des éléments et l'ordre des éléments doit être modifiable à l'intérieur du conteneur. Lors de la réorganisation, je n'mise à jour de la sort_order pour les éléments dans le conteneur actuel, ce qui signifie pas beaucoup de gens (généralement dans la pratique, seuls quelques-uns) des lignes doivent être mis à jour.
En bref, je ne les suivants:
[[id, sort_order], [id2, sort_order], ...]
update item set sort_order=SORT_ORDER where id=ID
(executemany) avec fusionnée liste(Si vous déplacez l'élément vers un autre récipient, après la mise à jour "conteneur de clé étrangère" déplacer la première ou la dernière fonction app.)
(Si la mise à jour implique un grand nombre d'éléments, je ne pense pas que cette solution est une bonne approche.)
J'ai fait un exemple d'utilisation de python et mysql sur http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html (copie et de l'essayer) avec quelques explications supplémentaires.
En réponse à votre message ici, la réponse que vous cherchez peut-être est:
À l'ordre chronologique, ajouter un
DateAdded
ou colonne similaire avec undatetime
ousmalldatetime
type de données.Sur toutes les méthodes qui s'insèrent dans la base de données, assurez-vous d'insérer
CURRENT_TIMESTAMP
dans leDateAdded
colonne.Sur les méthodes de requête de la base de données, ajouter
ORDER BY DateAdded
à la fin de la chaîne de requête.Ne JAMAIS compter sur la position physique dans le système de base de données. Il peut travail la PLUPART du temps, mais certainement pas TOUT le temps.
Tout d'abord, permettez-moi d'accord avec tout le monde ici que l'ordre dans la table ne compte pas. Utiliser un [Déplacer] de la colonne que vous mettez à jour et inclure une clause Order By.
Cela dit, les bases de données SQL Server permettent à un seul "index cluster" sur une table qui fait la force de la position dans la table sous-jacente de stockage. Surtout utile si vous avez un gros jeu de données et toujours de la requête par quelque chose de spécifique.
La question est dépourvue de tout détail qui permettrait à quelqu'un de vous donner la réponse correcte. Clairement, vous pourriez lire les enregistrements en mémoire, puis de les mettre à jour. Mais ce qui est mauvais sur tant de niveaux différents.
Le problème est le suivant. Selon le schéma qui est réellement mis en œuvre, il est logique de la façon dont les enregistrements sont écrites physiquement sur le disque. Parfois, ils sont écrits dans l'ordre d'insertion et d'autres fois ils sont insérés avec l'espace entre les blocs (voir les extensions).
Afin de changer l'ordre physique n'est probablement pas sans changer les données de la colonne; et cela a un effet profond sur les différents indices. Vous êtes de gauche d'avoir à changer l'ordre logique.
Que j'ai lu votre mise à jour... je suis de gauche à comprendre que vous pouvez avoir plusieurs utilisateurs et chaque utilisateur est d'avoir des signets qu'ils veulent commander. On dirait que vous besoin d'une deuxième table qui agit comme une intersection entre l'utilisateur et le signet. Ensuite, tous vous avez besoin est une jointure interne et une commande par.
Mais il n'y a pas assez d'information pour offrir une solution complète.
Ajouter un
position
colonne de votre table et de les stocker comme un simple entier.Si vous avez besoin de prendre en charge plusieurs utilisateurs ou des listes, votre meilleur pari est de créer des signets table, une table d'utilisateurs et une table de lien entre eux.
id,url
id,name
user_id, bookmark_id, position, date_created
En supposant
date_created
est remplie lors de l'insertion de lignes, vous pouvez obtenir la liste secondaire de la commande en fonction de la date.Ici est un stockées procédure de script pour incrémenter ou décrémenter (un à la fois) dans MySQL
Note, MySQL ne vous permet pas de sélectionner dans la même requête, vous faites une mise à jour si les réponses ci-dessus ne fonctionnent pas.
J'ai aussi mis à renvoyer une erreur si il n'y a pas d'article ci-dessus /ci-dessous si vous êtes incrémentation /décrémentation, respectivement.
Appeler avec
Dans des moments comme cela, je me souviens d'une citation de la Matrice: "N'essayez pas de l'ordre de la base de données. C'est impossible. Au lieu de cela, seulement de réaliser la vérité... il n'y a pas d'ordre. Ensuite, vous verrez que le tableau que les ordres que lui-même, c'est toi qui commandes de la table."
Pour travailler avec MySQL via une interface graphique, il y a toujours une décision à prendre. Si vous lancez quelque chose comme
SELECT * FROM users
, MySql va toujours prendre une décision de cette commande par un certain domaine. Normalement, ce sera la clé primaire.Lorsque vous ajoutez un
ORDER BY
commande à la requête, il prendra la décision à l'ordre par un autre champ.Par Exemple
Select * From users ORDER BY name
donnerait:Donc à votre question, vous voulez changer l'ordre par défaut par laquelle votre tableau affiche cette information. Pour ce faire, vérifiez que votre champ de Clé Primaire
est. Pour la plupart des cas, avoir une identification unique nombre naturel a tendance à faire le truc. MySQL a un AUTO_INCREMENT de la fonction pour cela. Lors de la création de la table, il ressemblerait à quelque chose comme
field_name int NOT NULL AUTO_INCREMENT
.Tout cela, c'est-à-dire: si vous souhaitez modifier la "ligne de commande", vous devez mettre à jour cette valeur. Cependant, depuis l'identificateur est quelque chose que les autres tables pourraient utiliser pour faire référence à votre terrain, cela semble un peu téméraire.
Si vous avez par exemple a:
UPDATE table Set id = 1 where id = 2;
, ce serait d'abord ne pas, depuis le champs id est à la fois une valeur identique et ne parviennent pas PrimaryKey vérifier (qui insiste sur à la fois l'unicité et ayant une valeur définie). Vous pouvez Jongler en exécutant trois mise à jour des déclarations en ligne:Cela aurait pour résultat les lignes de ce tableau qui ressemble à:
Qui techniquement pourrait fonctionner pour réorganiser cette table, mais c'est dans une bulle. MySQL être une base de données relationnelle signifie que toute la table qui était en fonction de ce que les données soient cohérentes va maintenant être fait pour de mauvaises données. Par exemple, j'ai une table qui stocke les anniversaires, la référence à l'utilisateur initial de la table. C'est la structure pourrait ressembler à ceci:
En passant l'ID de l'utilisateur sur le tableau, vous DEVEZ mettre à jour les user_id valeur sur les anniversaires de la table. Bien sûr, MySQL vient préparés à cela: d'une entrée "Les Contraintes De Clé Étrangère". Aussi longtemps que vous avez configuré tous vos contraintes de clé étrangère de Mises à jour en Cascade, vous n'avez pas besoin de modifier manuellement la référence pour chaque valeur que vous avez changé.
Ces requêtes seraient tous beaucoup de travail manuel et risque d'affaiblir votre intégrité des données. Si vous avez les champs que vous voulez rang et réorganiser régulièrement, la réponse posée par Mike Lewis sur cette question avec le "tableau de commande" serait plus judicieux de réponse (et si c'est le cas, alors il s'agit de la meilleure solution et il suffit de les ignorer cette réponse).