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

Модераторы: Akina
  
> Поиск в таблице по условиям из этой же таблицы , с помощью хранимой процедуры
    Здравствуйте.
    Очень охота сделать хранимую процедуру, которая:
    1 берёт запись по `index` из таблицы
    2 вынимает из этой записи условия поиска `value`, `minimum` и `maximum`
    3 ищет другие записи, `value` которых находится между `minimum` и `maximum` исходной записи (по `index`)
    4 причём собственное `value` записи (по `index`) должно встречно укладываться между `minimum` и `maximum` искомых записей

    Можно в хранимых процедурах MySQL такое сделать? Если можно, то хотелось бы ссылку на похожий пример хотя бы :)

    ExpandedWrap disabled
      DELIMITER $$
       
      DROP PROCEDURE IF EXISTS `find`;
      CREATE PROCEDURE `find` (IN `index` BIGINT UNSIGNED)
      BEGIN
          -- how to do ?
      END $$
       
      DELIMITER ;
       
      DROP TABLE IF EXISTS `table`;
      CREATE TABLE `table`
      (
          `index` BIGINT UNSIGNED PRIMARY KEY,
          `value` TINYINT UNSIGNED NOT NULL INDEX,
          `minimum` TINYINT UNSIGNED NOT NULL INDEX,
          `maximum` TINYINT UNSIGNED NOT NULL INDEX
      );
    Сообщение отредактировано: FateFlex -
      Собственно эти два SELECT как в хранимой процедуре разместить и как из результатов первого SELECT взять результат и уже по нему выполнить второй SELECT?
      ExpandedWrap disabled
        DROP TABLE IF EXISTS `table`;
        CREATE TABLE `table`
        (
            `index` BIGINT UNSIGNED PRIMARY KEY,
            `value` TINYINT UNSIGNED NOT NULL,
            `minimum` TINYINT UNSIGNED NOT NULL,
            `maximum` TINYINT UNSIGNED NOT NULL
        );
         
        INSERT INTO `table` VALUES
        (1, 1, 3, 5),
        (2, 4, 5, 5),
        (3, 2, 2, 4),
        (4, 5, 4, 3),
        (5, 3, 1, 5);
         
        SELECT `value`, `minimum`, `maximum`
        FROM `table`
        WHERE `index` = 1;
         
        +-------+---------+---------+
        | value | minimum | maximum |
        +-------+---------+---------+
        |     1 |       3 |       5 |
        +-------+---------+---------+
         
        SELECT `index`
        FROM `table`
        WHERE `index` != 1
        AND `minimum` <= 1
        AND 1 <= `maximum`
        AND 3 <= `value`
        AND `value` <= 5
        LIMIT 1;
         
        +-------+
        | index |
        +-------+
        |     5 |
        +-------+
        Динамический заспрос решает проблему. Синтакс зависит от БД. Вот MS SQL код. Переведи на MySql:
        ExpandedWrap disabled
          DECLARE @Sql nvarchar(4000)
           
          SELECT @Sql = 'SELECT TOP 1 [index] ' +
          'FROM [table] ' +
          'WHERE [index] != ' + cast([value] as varchar) + ' '
          ' AND [minimum] <= ' + cast([value] as varchar) + ' '
          ' AND ' + cast([value] as varchar) + ' <= [maximum] ' +
          ' AND ' cast([minimum] as varchar) + ' <= [value] ' +
          ' AND [valu]e] <= ' + cast(maximum as varchar)
          FROM [Table]
          WHERE [index] != 1
          AND [minimum] <= 1
          AND 1 <= [maximum]
          AND 3 <= [value]
          AND [value] <= 5
           
           
          EXEC(@Sql)
          Да не нужен тут динамический SQL...

          https://www.sql.ru/forum/actualutils.aspx?a...77&msg=22425546
          Сообщение отредактировано: Akina -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0226 ]   [ 15 queries used ]   [ Generated: 16.04.24, 12:17 GMT ]