Как я могу переупорядочить строки в sql базе данных

Вы можете включить или выключить бесшумный режим в .onInit с помощью SetSilent, но как только эта функция вернется, режим пользовательского интерфейса изменить нельзя.

Простое решение заключается в том, чтобы просто использовать один из плагинов Banner или Splash в конце вашего последнего Section для отображения сообщения / изображения.

Или вы можете создать фальшивый бесшумный режим с минимальным пользовательским интерфейсом, который отображает только индикатор выполнения:

!include LogicLib.nsh
Var Silent

Function .onInit
${If} ${Silent}
    SetSilent Normal ; Turn off real silent mode
    SetAutoClose True
    StrCpy $Silent 1 ; Fake silent mode
${EndIf}
FunctionEnd

Page Components SkipPageIfSilent
Page Directory SkipPageIfSilent
Page InstFiles "" TweakInstfilesPage

Function SkipPageIfSilent
IntCmp $Silent 0 +2
    Abort
FunctionEnd

Function TweakInstfilesPage
${If} $Silent <> 0
    SetSilent Silent ; Make IfSilent return true
    FindWindow [110] "#32770" "" $HWNDPARENT
    GetDlgItem [110] [110] 0x403 ; Show details button
    ShowWindow [110] 0
    System::Call 'USER32::GetWindowRect(p[110],@r1)' ; NSIS v3+
    System::Call 'USER32::GetWindowRect(p$HWNDPARENT,@r2)' ; NSIS v3+
    System::Call '*$1(i,i.r3,i,i)'
    System::Call '*$2(i.r5,i.r6,i.r7,ir3r8)'
    IntOp $5 $7 - $5 ; Width
    IntOp $6 $8 - $6 ; Height
    System::Call 'USER32::SetWindowPos(p$HWNDPARENT,p,i,i,ir5,ir6,i0x12)'
    SetDetailsView Hide
${EndIf}
FunctionEnd

Section
Sleep 333
Sleep 333
Sleep 333
Sleep 333
SectionEnd

36
задан angry person 9 August 2011 в 08:22
поделиться

11 ответов

Похоже, вам нужен еще один столбец, такой как «ListOrder». Таким образом, ваша таблица может выглядеть следующим образом:

BookMark ListOrder
======== =========
  d        1
  g        2
  b        3
  f        4
  a        5

Тогда вы можете «упорядочить» по ListOrder.

Select * from MyTable Order By ListOrder

Если пользователь может перемещать закладку только на одно место за раз, вы можете использовать целые числа в качестве ListOrder и поменять их местами. Например, если пользователь хочет переместить «f» на одну строку вверх:

Update MyTable
    Set ListOrder=ListOrder+1
        Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f')

Update MyTable
    Set ListOrder=ListOrder-1
        Where BookMark='f'

Если пользователь может переместить закладку вверх или вниз на несколько строк одновременно, вам необходимо изменить порядок сегментов. Например, если пользователь хочет переместить «f» в начало списка, вам необходимо:

update MyTable
    Set ListOrder=ListOrder+1
        where ListOrder>=1 -- The New position
            and ListOrder <(Select ListOrder from MyTable where BookMark='f')

 update MyTable
     Set ListOrder=1 -- The New Position
         Where Bookmark='f'
71
ответ дан 27 November 2019 в 05:16
поделиться

Как уже упоминали другие, не стоит полагаться на физический порядок таблицы базы данных. Реляционные таблицы концептуально больше похожи на неупорядоченные множества, чем упорядоченные списки. Предполагая, что определенный физический порядок может привести к непредсказуемым результатам.

Похоже, вам нужен отдельный столбец, в котором хранится предпочтительный порядок сортировки пользователя. Но вам все равно нужно будет что-то сделать в своем запросе, чтобы отобразить результаты в таком порядке.

Можно указать физический порядок записей в базе данных, создав кластеризованный индекс, но это не то, что вам нужно хочу сделать на произвольной указанной пользователем основе. И это все еще может привести к неожиданным результатам.

20
ответ дан 27 November 2019 в 05:16
поделиться

Базы данных могут хранить данные любым удобным для них способом. Использование предложения order by - единственный способ , чтобы гарантировать упорядочение данных. В вашем примере закладки вы могли бы иметь целочисленное поле, которое указывает порядок, а затем обновлять это поле, когда пользователь перемещает объекты. Затем закажите этот столбец, чтобы получить все в правильном порядке.

4
ответ дан 27 November 2019 в 05:16
поделиться

Используйте ORDER BY в вашем запросе SELECT . Например, чтобы упорядочить по фамилии пользователя, используйте:

SELECT * FROM User ORDER BY LastName
9
ответ дан 27 November 2019 в 05:16
поделиться

Полагаю, вам нужен простой заказ на ?

select my_column from my_table order by my_order_column;
1
ответ дан 27 November 2019 в 05:16
поделиться

Как заявили другие, используйте заказ по.
Никогда не зависите от порядка данных в физической таблице, всегда основывайте его на данных, с которыми вы работаете, будь то одно или несколько ключевых полей.

1
ответ дан 27 November 2019 в 05:16
поделиться

Порядок строк в фактической базе данных не должен иметь значения.

Вы должны использовать предложение ORDER BY в своих запросах, чтобы упорядочивать их по мере необходимости.

5
ответ дан 27 November 2019 в 05:16
поделиться

В ответ на ваше сообщение здесь , вы можете найти ответ:

Чтобы упорядочить в хронологическом порядке, добавьте DateAdded или подобное столбец с типом данных datetime или smalldatetime .

Во всех методах, которые вставляются в базу данных, убедитесь, что вы вставили CURRENT_TIMESTAMP в DateAdded column.

В методах, которые запрашивают базу данных, добавьте ORDER BY DateAdded в конце строки запроса.

НИКОГДА не полагайтесь на физическую позицию в системе базы данных. Он может работать БОЛЬШЕ времени, но определенно не ВСЕ время.

0
ответ дан 27 November 2019 в 05:16
поделиться

First, let me agree with everyone here that the order in the table shouldn't matter. Use a separate [SortOrder] column that you update and include an Order By clause.

That said, SQL Server databases do allow for a single "clustered index" on a table that will actually force the position in the underlying table storage. Primarily useful if you have a big dataset and always query by something specific.

1
ответ дан 27 November 2019 в 05:16
поделиться

The question lacks any detail that would let anyone give you correct answer. Clearly you could read the records into memory and then update them. But this is bad on so many different levels.

The issue is like this. Depending on the schema that is actually implemented there is logic to the way that the records are physically written to disk. Sometimes they are written in order of insert and other times they are inserted with space between blocks (see extents).

So changing the physical order is not likely without swapping column data; and this has a deep effect on the various indices. You are left having to change the logical order.

As I read your update... I'm left to understand that you may have multiple users and each user is to have bookmarks that they want ordered. Looks like you need a second table that acts as an intersection between the user and the bookmark. Then all you need is an inner join and an order by.

But there is not enough information to offer a complete solution.

0
ответ дан 27 November 2019 в 05:16
поделиться

Добавьте столбец position в свою таблицу и сохраните его как простое целое число.

Если вам нужно поддерживать несколько пользователей или списков, лучше всего создать таблицу закладок, таблицу пользователей и таблицу, чтобы связать их.

  • закладки: id, url
  • users: id, name
  • users_bookmarks: user_id, bookmark_id, position, date_created

Предполагая, что date_created заполняется при вставке строк, вы можете получить вторичный порядок списка на основе даты.

select bookmark_id from users_bookmarks where user_id = 1 order by position, date_created;
1
ответ дан 27 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: