Взимане на предния запис в sql таблица (от autoincrement)

Pok4

Registered
Здравейте,

Пиша поредния екстеншън за аргос, давам малко демо:

323.png


целта е ясна - ре-ордер на страници от менюто, минаха 2 часа и не мога да намеря решение. Попадах на заявки с инър джойни и какви ли не неща, но не става...
Проблема е, че в таблицата всичко от autoincrement-а е разбъркано, демо:
11.png

Някой има ли идея, примерно ако цъкна "Custom title" да ми извади "All Users" и ако кликна All users" да ми извади "Статистика" и обратно, но напред...


Autoincrement-a не е подреден и няма как да е, тъй като се спират/пускат екстеншъни и стават едни .... :D
 
Ами не използвай primary key-а. Тази колона не се използва за такъв тип сортирания.

Като искаш да пазиш позиция, си добави колона за тази цел или според зависи от изискванията може и отделна таблица.
 
Принципно да, не се ползва, но държа да е така, не искам да създавам излишни колони или пък таблици. За това пуснах тема, тъй като е специфично. Ако хвана само следващия или предния запис, ще сложа 1 ъпдейт заявка и всичко ще се нареди...
Но търся и нищо конкретно. Има някакви в stackoverflow-a дават някакви заявки с LAG, но не ми вършат работа, тъй като няма where клауза или пък аз не разбирам какво да променя в заявката...
Сега съм подредил всичко, аякс заявките работят, остана само ей това нещо и ако го оправя ще е супер... Иначе потребителите трябва да спират/пускат екстеншъни докато нагодят позициите на страниците от екстеншъните... (тъй като екстеншъните създават понякога и къстъм страници).
 
Защо не го направиш с колона place_order примерно. ID-то на страницата не бих го използвал за тази цел. Така съм го направил в мой проект. Местенето спрямо позициите на другите страници да дава стойност спрямо това къде го поставяш. И бих ползвам drag and drop функционалност, но това са моите извратени фронт енд виждания.
 
Разбирам ви и двамата, но не искам, искам да е така с манипулация на аutoincrement-a...
Иначе стилизацията - да, с drag and drop ще е готино, но мисля, че и така става... Даже може да се сложат проверки и да маха стрелкичките накрая и да остава само 1 за надолу и 1 за нагоре, но това после.. Сега да намеря начин да оправя това с прихващането на предните и следващите резултати ...

Искам да подчертая, че имам ID и име на страницата, която цъкам, натам вече... не знам какво да правя :D
 
Ами не мога да ти помогна тогава. Ако за теб нужна колона е излишна колона, аз съм до тук. От мен няма да видиш да дам решение, което не е правилно. Това е причината да не пиша по такива теми.

Успех!
 
Разбирам ви и двамата, но не искам, искам да е така с манипулация на аutoincrement-a...
Иначе стилизацията - да, с drag and drop ще е готино, но мисля, че и така става... Даже може да се сложат проверки и да маха стрелкичките накрая и да остава само 1 за надолу и 1 за нагоре, но това после.. Сега да намеря начин да оправя това с прихващането на предните и следващите резултати ...

Искам да подчертая, че имам ID и име на страницата, която цъкам, натам вече... не знам какво да правя :D
Да манипулираш нещо, което може да се прецака. Нали знаеш, че аутоинкремента е функция в SQL-а, и на практика нейната цел е съвсем друга от това да се играе с нея. Според мен ще попречиш и на пърформънса да мъчиш така SQL-а. НЕ съм велик бек ендър, дори не много добър, но според мен ще се блъскаш доста докато намериш решение в твоята посока. Не знам дали е практика да го правят дори и да го намериш.

Ако решиш да на го сторваш в базата, вече имаш и други опции. :)
 
Няма, там нищо няма да стане, ако добавя нова колона тепърва ще трябва още код за нея... Няма да стане нищо така, а и там няма да има 200 записа. Говорим за 5-10 резултата макс.

Вече намерих решение за предишния row:
select id,page_name from table where id<"'.$id.'" order by id desc

Сега ще потърся и нещо за следващ...
 
Добре де, и как ще сторваш новата позиция? Този ордеринг на страници къде се намира и кой може да го достъпва? Админа?

Защо мислиш, че е много код? Според мен имаш само едно сортиране по този рол. Или нещо бъркам.
 
Снощи беше късно и батерията падна на лаптопа.
Това е страница, която е достъпна само от админите. В нея се съхраняват освен страниците от екстеншъните, а и създадените от админите през менюто. Накрая има type и седи ext или 0 (custom страница от админ панела). Ако създам нова колона, трябва освен в екстеншъните да пипам, а и по ядрото. Трябват проверки кое е последното число в новата колона и да добавя +1... Не знам въобще дали няма и пак да даде на късо с разнородни айдита, тъй като се спират/пускат екстеншъни и се трият/създават страници. Ще стане пак същото с аутоинкремента. Даже мисля, че може и да не го пипам, просто да сменя имената и типа (да ги swap-на) с ъпдейт заявката.
 
Последно редактирано:
previous row:
select * from table where id<"'.$id.'" order by id desc

next row:
select * from table where id = (select min(id) from table where id > '.$id.')

на мястото на $id седи текущото ви айди. Всичко работи и е тествано :) Ще дам демо на екстеншъна по-късно днес.

full example: https://web-tourist.net/threads/argos-multigaming-cms.131376/page-5#post-678737 :)
 
Последно редактирано:
Значи го направи все пак. По един твой си начин. :)

Ако има толкова промени в кода (значи обхождаш таблицата с всичките и ролове), можеше тогава да е с допълнителна таблица, която да е свързваща. С полетата, които са ти нужни, в случая 2 или 3 рола. Да прави проверка там. Но това е цяла една нова таблица за меню то 5-6 линка, което не, че е безсмислено, но е малко много. Все пак се води отново добра практика, ако нямаш друг избор.
 
SELECT value - lag(value) OVER (ORDER BY Id) FROM table



lag ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

Returns value evaluated at the row that is offset rows before the current row within the partition; if there is no such row, instead returns default (which must be of a type compatible with value). Both offset and default are evaluated with respect to the current row. If omitted, offset defaults to 1 and default to NULL.



Oracle, PostgreSQL, SQL Server и много други RDBMS двигатели имат аналитични функции, наречени LAGи LEADкоито правят точно това.

В SQL Server преди 2012 г. ще трябва да опиташ следното:

Код:
SELECT  value - (
        SELECT  TOP 1 value
        FROM    mytable m2
        WHERE   m2.col1 < m1.col1 OR (m2.col1 = m1.col1 AND m2.pk < m1.pk)
        ORDER BY 
                col1, pk
        )
FROM mytable m1
ORDER BY
      col1, pk
, къде COL1е колоната, по която поръчвате.

Наличието на индекс (COL1, PK)ще подобри значително тази заявка.
 

Back
Горе