На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> MsSQL --> MySQL , Помогите конвертировать запрос
    Версия MySQL 5.6.32-78.0-log

    Добрый день/вечер.
    Помогите пожалуйста конвертнуть запрос с MsSQL в MySQL.
    ExpandedWrap disabled
      declare @xml xml
      SET @xml='<rows> <row id = "280">112</row> </rows>'
       
      SELECT Art.SortKey, T.title, T.price, T.activity FROM
         (select b.value('@id' , 'int') [SortKey], b.value('.' , 'varchar(50)') [ArtNo] from @xml.nodes('/rows/row') a(b) )as Art
       
         LEFT JOIN
       
         `tr`.`product` AS T
       
      ON T.id = Art.ArtNo


    Пробовал онлайн сервис sqlines, после его работы получил ошибку синтаксиса.
      MySQL не поддерживает тип данных XML. Прямое преобразование невозможно.

      Можно импортировать XML в таблицу (возможно, временную), и затем работать с импортированными данными. Но надо как минимум гарантировать, что в структуре XML нет никаких выпендронов - импорт достаточно туп, и шуток не понимает.
        У меня в локальном приложении есть таблица (таблица не на sql, а таблица как в excel программная на wx_widgets) с id товаров, нужно с удаленной бд получить название товаров по id и поместить в таблицу.
        Таблица типа:
        __________________
        № | id | name | price |
        ----------------------
        1 |251 |???? |???? |
        -----------------------
        4 |5142 |???? |???? |
        -----------------------
        Где № - номер ячейки, id - id товара.


        Если я просто пошлю запрос типа:
        ExpandedWrap disabled
          SELECT name, price FROM 'bd' WHERE id IN(251, 5142, 547, 454, 444);

        То, бд вернет мне товары и мне придется делать программную сортировку, делать двойной вложенный цикл и сравнивать id из запроса и id в таблице, чтобы все это рассортировать.
        В итоге очень долгая сортировка получается... Когда в локальной таблице около 1000 ячеек и запрос вернул тысячу строк получается цикл 1000*1000...

        for j = 0 to 999 //Проходим по всей 1000 строк из запроса к бд...
        for i=0 to 999 //проходим для каждого запроса таблицу с нуля и сравниваем id из запроса и из таблицы, если равны то записываем товар в таблицу и exit
        if id[i]=id[j] then table[i]=Запрос[j]
        next
        next

        Тот запрос на MsSQL передавал в бд вместе с id товара мои номера ячеек из таблицы и запрос возвращал мне имена товара вместе с номером ячейки.
        В итоге мне не нужно было делать сортировку я сразу знал куда (в какую ячейку) записать результат.
        Возвращал так примерно:
        1, Товар Апупенный, 5000р
        2, Товар Хороший, 4500р

        И я просто записывал в свою таблицу table[Запрос1.1]=Запрос1.2
        Где 1.1 возвращал мне номер ячейки, а 1.2 название товара...
        Можно так же на MySQL сделать подскажите пожалуйста?
        Сообщение отредактировано: Rzonex -
          ExpandedWrap disabled
            SELECT name, price
            FROM bd
            WHERE id IN (251, 5142, 547, 454, 444)
            ORDER BY FIELD(id, 251, 5142, 547, 454, 444);

          Записи вернутся в заданном в аргументе функции порядке.

          Вот только надо иметь гарантии, что все переданные ID присутствуют в таблице.
          Сообщение отредактировано: Akina -
            Цитата Akina @
            ExpandedWrap disabled
              SELECT name, price
              FROM bd
              WHERE id IN (251, 5142, 547, 454, 444)
              ORDER BY FIELD(id, 251, 5142, 547, 454, 444);

            Этот запрос не вернет номера ячеек.
            Я просто не стал сильно вдаваться в подробности работы программы, но нужно именно вернуть номера ячеек, никак уж по другому нельзя...
            Нужно именно чтобы запрос вернул номера мои которые я в запросе передал, это очень важно. Без этого уж никак.
            Нужен именно аналог того запроса на MsSQL который передавал в xml номера ячеек.
            Нужно именно запрос типа: Я тебе даю номер и id - верни мне товар с этим id и тот номер что я тебе дал.
            Сообщение отредактировано: Rzonex -
              Помогите кто-нибудь пожалуйста, кто MySQL хорошо знает?
                Цитата Rzonex @
                Нужно именно чтобы запрос вернул номера мои которые я в запросе передал

                Я тебя не понял... у меня же в запросе и есть принятый сервером и переданный клиентом список номеров. Причём именно в том порядке,в каком они передавались. И именно в этом порядке вернутся записи.

                Добавлено
                Цитата Rzonex @
                Я тебе даю номер и id - верни мне товар с этим id и тот номер что я тебе дал.

                Ты эта... определись... вот твой пример:

                Цитата Rzonex @
                Если я просто пошлю запрос типа:

                ExpandedWrap disabled
                  SELECT name, price FROM 'bd' WHERE id IN(251, 5142, 547, 454, 444);


                То, бд вернет мне товары

                Где тут номер?
                  Цитата Akina @
                  Ты эта... определись... вот твой пример:

                  Я писал, что это плохой пример. Я писал, что если просто так отправить то не получится.
                  Нужно отправить номер ячейки к примеру 51 и id например 5021, а вернуло чтобы товар с этим id и номер 51. И так для всех id которые я пошлю.
                  К примеру посылаю:
                  № | id
                  -------
                  1 | 5124
                  2 | 4145
                  5 | 7841
                  12 | 7474
                  17 | 46654


                  а возвращает имя товара с этим id и тот номер ячейки который я передал в запрос

                  № | Название
                  --------
                  1 | Драпуля
                  2 | Хренуля
                  5 | Фигуля
                  12 | итдитп
                  17 | фыва

                  Akina можешь пример небольшой набросать как такое реализовать пожалуйста.
                  Сообщение отредактировано: Rzonex -
                    Цитата Rzonex @
                    К примеру посылаю:
                    № | id
                    -------
                    1 | 5124
                    2 | 4145
                    5 | 7841
                    12 | 7474
                    17 | 46654
                    а возвращает имя товара с этим id и тот номер ячейки который я передал в запрос


                    ExpandedWrap disabled
                      SELECT name, price, id, ELT(FIELD(id, 5124, 4145, 7841, 7474, 46654), 1, 2, 5, 12, 17) cellnum
                      FROM bd
                      WHERE id IN (5124, 4145, 7841, 7474, 46654)
                      ORDER BY FIELD(id, 5124, 4145, 7841, 7474, 46654);
                      Akina
                      Спасибо большое! Все работает. С меня лайк :thanks:

                      Сортировка там по моему не нужна, пробовал без ORDER BY - работает так же, а мне в принципе все равно в каком порядке они придут.
                      Такие конструкции не сильно бд нагружать будут?
                      Сообщение отредактировано: Rzonex -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0326 ]   [ 16 queries used ]   [ Generated: 29.03.24, 14:16 GMT ]