Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Здравствуйте.
Очень охота сделать хранимую процедуру, которая: 1 берёт запись по `index` из таблицы 2 вынимает из этой записи условия поиска `value`, `minimum` и `maximum` 3 ищет другие записи, `value` которых находится между `minimum` и `maximum` исходной записи (по `index`) 4 причём собственное `value` записи (по `index`) должно встречно укладываться между `minimum` и `maximum` искомых записей Можно в хранимых процедурах MySQL такое сделать? Если можно, то хотелось бы ссылку на похожий пример хотя бы 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 ); |
Сообщ.
#2
,
|
|
|
Собственно эти два SELECT как в хранимой процедуре разместить и как из результатов первого SELECT взять результат и уже по нему выполнить второй SELECT?
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 | +-------+ |
Сообщ.
#3
,
|
|
|
Динамический заспрос решает проблему. Синтакс зависит от БД. Вот MS SQL код. Переведи на MySql:
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) |
Сообщ.
#4
,
|
|
|