За последние 24 часа нас посетил 18801 программист и 1635 роботов. Сейчас ищут 1170 программистов ...

update с условием

Тема в разделе "MySQL", создана пользователем joost, 19 дек 2007.

  1. joost

    joost Guest

    Есть две таблици
    data (name_data, cena)
    model (code_model, name_model, code_output)


    надо реализовать
    update `model` set `code_output`=1 where count(select * from `data` where `name_data` like '%name_model%')>0
     
  2. Ipolit

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

    С нами с:
    18 дек 2007
    Сообщения:
    34
    Симпатии:
    0
    1. для случая: name_data = name_model
    Код (Text):
    1. update model set code_output=1 where name_model in (select name_data from data)
    2. RTFM, рекомендую основательно прочитать, разобратся и изучить основы SQL

    3. Сразу отвечаю на вопрос: "что такое IN?" - см. п.2.
     
  3. joost

    joost Guest

    update model set code_output=1 where name_model in (select name_data from data) для limit 1 исполнялся 83.3123 сек

    в таблице model 25 000 записей, в data 114 000
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    update model, data set model.code_output=1 where model.name_model=data.name_data
    Но связывать таблицы надо по ключу типа integer с индексом, а не по name
    Иначе сразу убей себя об стену и не показывай людям кто ты есть.
     
  5. joost

    joost Guest

    так тоже пробовал!
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    пробовал что?
    убить себя об стену? или связать по нормальному ключу?
     
  7. joost

    joost Guest

    на даный момент использую такой скрипт

    $sql_model=mysql_query("select `name_model` from `model` ");

    for ($i=0;$i<mysql_num_rows($sql_model);$i++)
    {

    $model=mysql_fetch_array($sql_model);
    $sql_data=mysql_query("select * from `data` where `name_data` like '%$model[0]%' ");

    if (mysql_num_rows($sql_data)>0)
    {
    mysql_query("update `model` set `code_output`=1 where `name_model` like '$model[0]' ");
    }
    else
    {
    mysql_query("update `model` set `code_output`=0 where `name_model` like '$model[0]' ");
    }
    }

    время исполнения - несколько часов.
    может можно как-то другим способом?
     
  8. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да, пользоваться индексами. Задать себе вопрос зачем тебе лайк.
     
  9. joost

    joost Guest

    Есть две таблици
    модели и предложения продажи
    например
    модель (25 000 записей)
    samsung x820
    предложения продажи (114 000)
    samsung x820 (black)
    samsung x820 (серый)
    samsung x820 (красный)


    мне надо для каждой модели проверить есть ли она в продаже

    без лайк обойтись не могу.
    Может Вы имеете больше опыта и можете подсказать как без лайк? Буду рад!
     
  10. Anonymous

    Anonymous Guest

    Пользуясь случаем, передаю привет Славе Лошкомойникову, который обьяснял мне работу БД. Блогодаря ему я узнал что LIKE существует вообще, лишь спустя 4 месяца. %) Чему чертовски рад )
    ЗЫ. Он меня в свое время заставил написать программу реализующую работу индексов в БД. Осознание приходило тяжко, в то время литературы не было почти. Но когда пришло... :%))))
     
  11. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    цвет и другие параметры не должны находиться в имени. - ошибка в структуре базы.
    правильная структура предложений продажи:
    `model_id` int(11) NOT NULL default '0',
    `color_id` int(11) NOT NULL default '0',
    ...
    KEY `model_id` (`model_id`),
    KEY `color_id` (`color_id`),
    ...

    +1
     
  12. Anonymous

    Anonymous Guest

    Плохая привычка не перечитывать написанное. )
     
  13. joost

    joost Guest

    samsung x820 (black)
    samsung x820 (серый)
    samsung x820 (красный)

    это только примеры
    может быть
    samsung x820 + подарок
    samsung x820 + стартовый пакет
    да что угодно может быть!


    эти названия я тяну в базу из xml выгрузок прайсов интернет-магазинов


    тут без like не обойтись никак. Помоему!
     
  14. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    гуголь - первая нормальная форма.
    вот когда тянешь тогда ОДИН раз ищи лайком. и вставляй уже по людски.
    не поможет - меняй прокладку между монитором и клавой.
     
  15. joost

    joost Guest



    гуголь - первая нормальная форма - это Вы про Гугл?
    вот когда тянешь тогда ОДИН раз ищи лайком. и вставляй уже по людски - можно на примере? что имели в виду?

    не поможет - меняй прокладку между монитором и клавой. :oops:
     
  16. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да, про гугл.
    http://php.ru/forum/viewtopic.php?t=9070 почитай эту ветку. И вообще ЧИТАЙ.
    прочтешь - распишешь тут выводы по структуре своей базы. ПОСЛЕ этого будем говорить дальше.
     
  17. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
     
  18. joost

    joost Guest

    Есть таблица:
    [id] [login] [info]
    | 1 | vasya | fdgdf |
    | 2 | petya | fdgdf |
    | 3 | artem | sdafd |

    Создаём индекс по полю login, будет выглядеть примерно так:
    [id] [login]
    | 3 | artem |
    | 2 | petya |
    | 1 | vasya |

    источник http://php.ru/forum/viewtopic.php?t=9070

    Если индекс по полю login, то почему

    [id] [login]
    | 3 | artem |
    | 2 | petya |
    | 1 | vasya |

    а не
    [login]
    | artem |
    | petya |
    | vasya |

    где про индексы в мускуле почитать?
     
  19. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    про индексы достаточно того, что я написал в той ветке.
    тебе сейчас читать про нормальные формы.
     
  20. joost

    joost Guest

    как я понимаю у меня 1 н.ф.

    модели
    название_модели (text)
    наличие в продаже (int)


    предложения продажи
    название_предложения (text)
    цена (float)


    индексами надо сделать название_модели и название_предложения?
     
  21. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    тебе надо ВЫСТРОИТЬ структуру, а не "посмотреть какая у тебя сейчас", кросавчег.
    и подумай, как ты будешь связывать эти две таблицы.
    дальше думай сам, я пас.
     
  22. joost

    joost Guest

    сам ты кросавчег!
     
  23. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    угу, кросавчег, трачу время на человека, который так и не попытался использовать СВОЮ голову, все ищет пути "а вдруг добрая фея сама все сделает, только бы у меня ни одна мыслишка не проскочила"

    $200 за оптимизацию твоей базы по скорости.
     
  24. RomanBush

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

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Ну это, горячие финские парни. Тут вообще-то много вариантов решений есть. Надо хотя бы ему намекнуть, куда копать.
    Человек явно с такой задачей первый раз столкнулся и запутался.

    joost
    Тебе тонко намекают на то, что, когда ты забираешь свою xml с прайсами из интернет-магазинов, имеет смысл в этот момент её обработать. То есть - не просто тупо по полям скопировать и положить в свою базу, а, например, распарсить строки с названиями товаров и сделать из поля "название товара" несколько полей.
    А вот теперь думай.
    Кстати, хочу напомнить - "правильно заданный вопрос уже содержит половину ответа".