J'ai une application de diffusion de la musique où j'ai des listes de lecture. Chaque playlist a un maximum de 100 chansons. J'ai une table de mappage appelée playlistsongMapping code> qui a le schéma suivant +------+------------+--------+
|SongId| PlaylistId |Position|
+------+------------+--------+
| 1 | 10 | 2 |
| 2 | 10 | 1 |
| 3 | 10 | 3 |
| 5 | 10 | 4 |
| 6 | 11 | 1 |
+------+------------+--------+
3 Réponses :
Si vous pensez à cette colonne comme ordre de tri plutôt que d'une position exacte, vous pourriez avoir une stratégie d'avoir des lacunes, donc la numérotation de 10 , 20, 30. Ensuite, si vous souhaitez déplacer la 3ème chanson à la première position, vous pouvez le donner le numéro 5, ou vous pourriez même lui donner un nombre négatif. p> Le problème est que vous auriez toujours besoin de lire toutes les données, et la mise en œuvre de la numérotation deviendra bien plus compliquée, car vous devez maintenant vérifier si vous auriez besoin de ne rien mettre à jour, ni tout ou peut-être juste une partie de la liste. p> Donc, si j'étais vous, je le garderais simple, et je prendrais juste à jour tout ce qui a besoin de mettre à jour . Après tout, il n'y a pas beaucoup de lignes par playlist (même si vous autorisez 1000 chansons par liste de lecture), et si vous faites une mise à jour en vrac, une base de données devrait pouvoir gérer cela. Vous pouvez modifier toutes les lignes à la fois, puis mettez à jour la ligne d'une ligne à sa nouvelle position. De cette façon, vous n'aurez besoin que de deux déclarations: 1 pour insérer, mettre à jour ou supprimer une chanson spécifique et 1 pour changer tout ou partie de la liste pour conserver la numérotation ultérieure. P> dans le passé, j'ai mis en place cela de manière encore plus paresseuse, où j'ai gardé un ordre de tri avec un écart, avoir 2, 4, 6, 8 ... Puis, lorsque je voulais mettre à jour ou insérer à une certaine position, je pourrais simplement utiliser sortOrdon = position * 2-1 code> pour la ligne pour insérer ou mettre à jour, ou simplement supprimer n'importe quelle ligne: P> update Song
set
SortOrder = :NewPosition*2-1
where
SortOrder = :OldPosition*2;
"Le problème est si j'ai besoin de déplacer la chanson avec Songid: 3 à la première position que j'ai besoin de mettre à jour des rangées de Songid 1,2,3 " p>
Vous ne devez pas avoir besoin de plus de deux déclarations pour cela. p>
Vous pouvez mettre à jour toutes les valeurs de position (en dehors de celui que vous vous déplacez en première position) dans une déclaration en utilisant incrément / décrément selon le cas, puis utilisez une deuxième instruction pour mettre à jour la chanson spécifique que vous déplacez - par exemple p>
xxx pré> Ceci suppose que vous connaissez l'ID de la chanson que vous déplacez (et vous pouvez donc déterminer sa position actuelle, que vous avez besoin pour la clause WHERE dans la première requête) - Mais il devrait toujours être le cas que vous le savez, en fonction de votre description. p>
Notez que dans l'exemple ci-dessus, la position
= 1 code> n'est pas strictement nécessaire car 1 est la première position de la liste, mais ce code vise à couvrir un cas plus général. - par exemple Si vous vouliez le déplacer vers la position 2, vous ne voudriez pas inclure la chanson à la position 1 de l'incrément, donc dans ce cas, vous écrivezposition> = 2 code>. p> blockQuote>
Il y a une probabilité d'avoir la même position pour deux chansons (si je déplace la chanson 3 en position 2)
Si vous souhaitez déplacer la chanson 3 en position 2, vous écririez une position de jeu de listes de lecture upd upd upd up Upd updSongMapping = Position + 1 où playlistid = 10 et position <3 et position> = 2; Code> - encore une fois, la requête est Fait en fonction de ce que vous savez sur le mouvement que vous voulez faire. J'ai répondu spécifiquement en fonction des informations que vous avez fournies, mais oui un cas plus général ferait des allocations pour déplacer les choses au milieu de la liste, plutôt que le début ou la fin. J'ai mis à jour la réponse pour refléter que
Si vous êtes après un SP qui met à jour toutes les positions pertinentes dans la table lors du déplacement de la position, cela devrait faire le travail: cette solution suppose que vous utilisez SQL Serveur; Vous n'avez pas mis à jour vos tags depuis mon commentaire, nous n'avons donc aucune idée de ce que vous êtes à l'aide de RDBMS forts> en utilisant. EM> P> EDIT: Changement de logique, Beleive j'ai corrigé. p>
Cette méthode peut créer des positions en double. Supposons que je me déplace la chanson 8 en position 2. Je peux avoir deux chansons avec la même position 2
@ M14 Comment peut-on 2 chansons, dans la même playlist, avoir la même position? Cela devrait être impossible. 2 chansons ne peuvent pas occuper le même endroit dans une playlist en même temps. Tout comme 2 voitures ne peuvent pas occuper le même espace dans un parking en même temps. S'ils le peuvent, c'est une faille avec votre conception. Une combinaison de playlist et de position doit être unique, tout comme une chanson et une liste de lecture.
Vos (petits) échantillons de données ne montrent pas ce scénario, ni de ce scénario, ne vous expliquent pas que ceci est une possibilité non plus. Mais de toute façon, @ m14 je demande, pourquoi la liste de lecture 1 code> a 2 chansons (disons 3 code> et 4 code>) à la position 2 code>? Lorsque vous arrivez à cette chanson, vous prévoyez d'avoir les deux chansons jouer simultanément? Cela ferait une écoute affreuse que je suppose. :RÉ
Ce que je veux dire, c'est si nous déplacons la chanson 8 en position 2 puis la chanson 8 et la chanson 1 aurait la même position, non? Désolé id, je n'ai pas compris la logique correctement.
Semble que vous n'avez pas exécuté le SQL @ m14; C'est pourquoi je l'ai fourni dans un format complètement consommable. Mon exemple déplace explicitement chanson 2 code> pour positionner 2 code> (précédemment détenu par la chanson 3 code>). J'ai créé un db <> violon pour vous, mais je ne suggère exécutant SQL Vous êtes fourni avant de faire des réclamations. :)
Je cours le violon. ça fonctionne. Permettez-moi d'essayer ceci sur dB et de vous ba ck.
Un problème que j'ai trouvé, c'est que si j'ai 2 chansons 1 et 2, lorsque je déplace 1 à 2, alors a la même position 2.
@ M14 Le SQL que j'ai fourni ne produit pas ce comportement. Je suggérerais que vous l'avez mal implanté. DB <> Fiddle
J'ai répliqué la situation exacte que je suis confrontée en ce moment. Veuillez vérifier le violon DB <> Fiddle
Oui, je vois, @ m14. C'est le fait que la position1 soit ouverte. Permettez-moi de penser.
Pense que nous sommes là @ m14. Sinon, j'aurai besoin d'attendre demain.
Ouais, merci de vos efforts et de votre temps.
Un bon SGBDM, avec une base de données bien conçue, il est peu probable de lutter contre la mise à jour de quelques (centaines) rangées en même temps. Vous n'avez cependant pas demandé une question ici; Qu'est-ce que c'est? Les questions sur la conception de la base de données sont mieux placées sur DBA ; Le débordement de la pile est destiné à des questions spécifiques sur le codage. Vous avez également marqué 2 différents RDBMS, MySQL et SQL Server. Ce sont 2 produits très différents, alors je suggère de vérifier la double vérification laquelle vous êtes vraiment i> en utilisant.