За последние 24 часа нас посетили 17483 программиста и 1719 роботов. Сейчас ищут 1567 программистов ...

id

Тема в разделе "PHP и базы данных", создана пользователем Sleven, 24 авг 2006.

  1. Sleven

    Sleven Активный пользователь

    С нами с:
    18 июл 2006
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Сургут
    Существует каталог интернет-магазина. Все товары в нем забиты в базу MySQL и у каждого товара есть свой уникальный id (присваивается автоматически). При просмотре каталога товаров, список товаров выводится согласно данному id - т.е. от большего к меньшему. Требуется внести функцию, чтобы администратор сайта через панель управления мог определенный товар ставить на более высокое место или наоборот на более низкое. Можно сделать подобную функцию и чтобы id оставался уникальным, прийдется менять значение id и всех других товаров, но в таком случае получиться большое кол-во запросов к БД. Может кто подскажет более практичный алгоритм присвоения позиции товару?
    Что-то вроде этого: торт "Винни-пух" у нас был в каталоге под номером 14, а надо его поставить на номер 7, при этом чтобы другие товары не сбились.
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Sleven

    добавляешь поле вес по умолчанию 0 и ручками проствляешь веса. ну сортируешь по весу а не по id
     
  3. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    добавь дополнительное поле

    0 - сортировка по ид
    -1000.1000 - как тебе надо ниже или выше

    опередили.

    только сортируешь по весу, ид
     
  4. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
  5. Sleven

    Sleven Активный пользователь

    С нами с:
    18 июл 2006
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Сургут
    честно говоря не понял смысла - чем это поле будет отличаться от поля id, кроме того что его сам вручную заполняешь?
    Допустим вывожу товары по полю "вес", в котором стоит порядковый номер позиции товара, потом захочу сменить его позицию - тогда ведь все равно прийдется менять позиции остальных товаров?
     
  6. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    поясняю, вес по умолчанию - 0.

    DESC order, id
     
  7. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    не id позиций, а их "вес"
     
  8. Sleven

    Sleven Активный пользователь

    С нами с:
    18 июл 2006
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Сургут
    Ti ну так какой толк тогда - менять id всех товаров или менять "вес" всех товаров - кол-во запросов к базе данных в обоих случаях одинаково ведь
     
  9. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    не. ID существо неизменное, уникальное, если иго изменять теряюца эти важные свойства
     
  10. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    если вы начнете изменять id это будет уже не id а order ;)
     
  11. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    на кой ляд менять вес всех товаров то ? ставишь по умолчанию вес = 0. и меняешь только для тех товаров, которые должны быть выше, ниже.

    что именно непонятно, если непонятно, в предыдущем абзаце ?
     
  12. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    def

    id order
    1 0
    2 1
    3 2

    как сделать id 1 между id2 и id3?
     
  13. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    по-идее id вообще не должен играть в ORDER BY
    при создании поля сделать order = id
    при добавлении order = MAX(order)
     
  14. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    про между вопросов, кстати не было
    ээ, странный топик. уже три раза повторялось что default(order) = 0, откуда взялись 0,1,2 ?

    1 0
    2 -1
    3 1

    должен, сначала сортируешь по order, а внутри - по id (чтобы отработало тот несчастный 0, кот. по умолчанию)
     
  15. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    def
    обычно, подразумевается изменение порядка неоднократно

    Код (Text):
    1. id order
    2.  1   0
    3.  2   1
    4.  3   2
    5.  4   3
    id 1 между 3 и 4
    order = INT UNSIGNED
     
  16. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    я не догоняю про что. честно. (
     
  17. Sleven

    Sleven Активный пользователь

    С нами с:
    18 июл 2006
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Сургут
    я вообще ничерта не понял и еще больше запутался....видимо тупой.. :(
     
  18. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    что непонятно?
    менять нужно не только order текущей записи но и другие
     
  19. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    зачем ? order как раз и выводи запись из потока, сортированного по id.

    (неудачно имя order я выбрал)
     
  20. Sleven

    Sleven Активный пользователь

    С нами с:
    18 июл 2006
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Сургут
    мне кажется не совсем поняли смысл моего вопроса - алгоритм, позволяющий за меньшее кол-во запросов к базе, выполняющий требуемое - повысить или понизить позицию товара в каталоге
     
  21. jсda

    jсda Guest

    Добавляей поле position float.
    А там Order by position.... ну или сделай ORDER BY rand() - и пусть позиции выставляет им фартуна =)
     
  22. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Ну вот интересно, разобрался иль нет с проблемой...
    Вообще, по-хорошему надо сказать: "Читай мануал" и указать ссылки: http://mysql.ru/man/
    http://mysql.ru/faq/

    Но все же попробую объяснить
    назовем поле вес в mysql таблиуце: `weight`
    назначим ему тип: ind(11)
    Поставим значение по умолчанию: default = 0

    Все, данные в mysql таблице не трогаем, все путем.

    Теперь тебе надо изменить в запросе сортировку, как тебе говорили раньше и будут у тебя все элементы сортироваться по `id` если `width`==0 иначе, будут сортироваться по `width`

    Код (Text):
    1.  
    2.   id    weight
    3.   1    0
    4.   2    0
    5.   3    0
    6.   4    0
    7.   5    1
    8.   6    0
    И будет у тебя такой порядок: id5, 1, 2, 3, 4, 6
     
  23. smails

    smails Активный пользователь

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    Используя такой способ ты, напрмер четвёртую позицию не сможешь поставить третьей, или шестой....
     
  24. smails

    smails Активный пользователь

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    Может быть подойдёт способ замены?
    Например позиция шестая, а её нужно на третью, то тогда создать скрипт, который шестую позицию меняет с пятой, а потом пятую (бывшую шестую) меняет с четвёртой, потом четвёртую (бывшую пятой) меняет с третей и всё...
    или просто скрипт, который меняет позиции местами только один раз, тогда, чтоб сделать шестую позицию третьей, тебе нужно нажать на скрипт 3 раза :)
    И конечно же всё эти действия происходят не с полем id, а с другим...
     
  25. jсda

    jсda Guest

    Если в моем примере требуется вставить придмет межди 3 и 4-ой позицией, я задаю ему новую позицию 3.5, а скрипт приводит все в нормальный вид с целыми числами.... очень удобно.
    PHP:
    1. <?php
    2. /* Оптимизируем позиция */
    3. $db_s = exec_query("SELECT * FROM $modul_table WHERE catalog_id='$modul_id' ORDER by position",0);
    4. while($s = mysql_fetch_assoc($db_s))
    5.    {
    6.       $position_new++;
    7.       exec_query("UPDATE $modul_table set position='$position_new' WHERE id = '$s[id]'",0);
    8.    }?>