sql >> Databasteknik >  >> RDS >> Mysql

Hur låter man en användare infoga var som helst i en lista?

Den enklaste metoden ur en kodsynpunkt är att använda en länkad liststil, där du har ett nästa element-id, snarare än ett ordervärde. Detta är mindre användbart i små listor, men när du börjar utöka liststorleken gör det uppdateringar/flyttningar/borttagningar mycket renare och förhindrar att tusentals tuplar uppdateras för att göra en beställningsändring.

++ Jag har inget exakt kodexempel till hands, men du skulle ringa till alla listan över en användare

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

Detta skulle få alla inlägg från en enskild användare, och sedan skulle du ha ett fält som innehåller ID:t för nästa inlägg. För att börja skulle du behöva en nyckel för att identifiera det första inlägget (lagra id för det första inlägget i användarens info). När du har dragit det första inlägget tar du tag i dess "nästa"-värde och använder det för att identifiera nästa inlägg.

Det här verkar lite galet för en kort lista, men tänk på en användare med 1000 inlägg. Om de behöver lägga till 1 inlägg på andra plats. I ett traditionellt numeriskt beställningssystem skulle du nu behöva uppdatera 999 andra rader med en +1-uppdatering. Med den här lösningen, om du behöver infoga ett inlägg i den andra positionen, frågar du helt enkelt det första inlägget för att få dess nästa värde. När du har det ändrar du det så att det blir värdet på det nya andra inlägget och ställer in det andra inläggets nästa värde som det som ursprungligen innehas av det första.

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

Efter Infoga:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`



  1. mysql - välj timme i datumtid och grupp

  2. Oracle 10g accepterar 5-siffrigt år i ett datum

  3. Sqlite3 - Hur man importerar NULL-värden från csv

  4. Forcera indexanvändning i Oracle