За последние 24 часа нас посетили 19136 программистов и 1632 робота. Сейчас ищут 988 программистов ...

Проапдей поле в таблице в зависимости от значения другого по

Тема в разделе "MySQL", создана пользователем miketm, 21 июл 2015.

  1. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Господа, помогите начинающему советом. Необходимо написать хранимую процедуру, которая решала бы следующую задачу.

    Допустим есть таблица с товарами (prouctid), у каждого товара есть стоимость, выраженная в иностранной валюте (pricecur), а в поле curid хранится идентификатор валюты :

    Код (PHP):
    1. CREATE TABLE product (
    2.   `prouctid` INT NULL,
    3.   `prouctname` VARCHAR(255) NULL,
    4.   `pricecur` float(8,2) NULL,
    5.   `curid` INT NULL,
    6.   `pricerub` float(8,2) NULL)
    7.  
    8. ENGINE = InnoDB
    9. DEFAULT CHARACTER SET = utf8
    10. COLLATE = utf8_unicode_ci;
    11.  
    12. Пример записей таблицы:
    13. 1,'Телевизор', 156.00, 1343,NULL;
    14. 2,'Чайник', 116.00, 1343,NULL;
    15. 3,'Утюг', 176.00, 1343,NULL;
    16. 4,'Посудомойка', 126.00, 1343,NULL;
    17. 5,'Микроволновка', 256.00, 5343,NULL;
    18. 6,'Вентилятор', 16.00, 5343,NULL;
    19. 7,'Пылесос', 151.00, 5343,NULL;
    20. 8,'Бра', 16.00, 5343,NULL;
    21. 9,'Унитаз', 106.00, 5343,NULL;
    22. 10,'Раковина', 101.00, 5343,NULL;
    23.  
    24. Кроме того, есть таблица-справочник валют:
    25.  
    26. CREATE TABLE currency (
    27.   `curid` INT NULL,
    28.   `cur` varchar(3) NULL)
    29.  
    30. ENGINE = InnoDB
    31. DEFAULT CHARACTER SET = utf8
    32. COLLATE = utf8_unicode_ci;
    33.  
    34. Пример записей таблицы:
    35. 1343, 'EUR';
    36. 5343, 'USD';
    37.  
    38. Кроме того, есть таблица с курсами валют:
    39.  
    40. CREATE TABLE currate (
    41.   `cur` VARCHAR(3) NULL,
    42.   `currate` float(8,4) NULL)
    43.  
    44. ENGINE = InnoDB
    45. DEFAULT CHARACTER SET = utf8
    46. COLLATE = utf8_unicode_ci; 
    Пример записей таблицы:
    'EUR',62.1234;
    'USD',58.4567;

    ЗАДАЧА
    Необходимо написать хранимую процедуру, которая проапдейтит поле pricerub у всех записей product путем умножения значения из pricecur на соответствующий курс из таблицы currate. При этом следует иметь в виду, что количество записей в таблице product очень большое, поэтому, понятно дело, что выполнить связку
    product.curid -> currency.cur ->currate.currate необходимо сделать один раз в начале выполнения процедуры (а не выполнять на каждую запись в таблице product).

    Если писать на PHP, то можно было бы сначала сформировать массив валют и потом просто, для каждой валюты по-очереди проапдейтить записи, однако в написании процедур на mysql у меня опыта нет и вроде как с массивами в SQL проблема, поэтому у меня пока нет идей как решить эту задачу... помогите плиз советом, как нписать такой код. Спасибо.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Могу ошибаться, но кажется у тебя процедурный подход в программировании :)

    Тебе вроде надо запрос на изменение (один), а ты пишешь "дайте процедуру, вначале надо один раз сделать то-то". Зачем? SQL славен тем, что одним предложением описывается что надо сделать. А как сделать это уже его заморочки. Он знает что сделать вначале, а что потом.

    как-то так:
    Код (PHP):
    1. UPDATE 
    2.   product AS p JOIN
    3.   currency AS c ON c.curid = p.curid JOIN
    4.   currate AS r ON r.cur = c.cur
    5. SET 
    6.   p.pricerub = p.pricecur * r.currate
    sqlfiddle - бдыщь - в другой раз сам оформи такую заготовку, ок?!

    Добавлено спустя 15 минут 10 секунд:
    Re: Проапдей поле в таблице в зависимости от значения другого по
    p.s. может и лишнее, это всего-лишь пример, но я скажу:
    в currate для обозначения валюты напрашивается поле curid int. зачем там строковое название? запросы будут короче и эффективнее с целочисленным ключем. и вообще primary key здесь в явную нигде не обозначен, а он кагбе должен быть!!!
     
  3. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Re: Проапдей поле в таблице в зависимости от значения другог

    "Я же только учус!"))

    Преогромное спасибо!) Запрос выглядит рабочим :) Буду пробовать!
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Проапдей поле в таблице в зависимости от значения другог

    На здоровье! Будут деньги — заходи.