Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5

Селект для выбора значений, разделеннных пробелом, из строки

05.10.2011, 15:43. Показов 2086. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, с запросом к БД Nagios
Есть вот такие данные

Code
1
2
3
4
5
host_id            service_id              performance_data
101                 201                      load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0;
102                 202                      users=0;20;50;0
101                 203                      /=1324MB;6968;7839;0;8710
...                   ...                        ...

performance_data представляет собой текстовую строку и имеет следующий формат:
'label1'=value[UOM];[warn];[crit];[min];[max]; пробел 'label2'=value[UOM];[warn];[crit];[min];[max]; ...
UOM - единица измерения
лейблов может быть от 1 до, к примеру, 10

Нужно распарсить эти строки и получить следующую выборку
Code
1
2
3
4
5
6
7
param_id     host_id            service_id              label              value             warn       crit        min       max
01             101                 201                      load1             0.000             5.000      10.000   0
02             101                 201                      load5             0.000             4.000      6.000     0
03             101                 201                      load15            0.000             3.000      4.000     0
04             102                 202                      users             0                   20           50         0
05             101                 203                      /                   1324              6968        7839      0         8710
... и т.д.
Итого нужно:
1. Разбить performance_data на строки (разделитель пробел), сформировать из них столбец
2. Разбить каждую строку на столбцы label, value, warn, crit, min, max, (разделители ; и = ) и отрезать единицу измерения, если она есть
3. Пронумеровать строки (присвоить уникальный ключ) - param_id - что-то наподобие row_number в Oracle
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2011, 15:43
Ответы с готовыми решениями:

загрузить в селект данные из БД по результатам выбора в двух остальных селектах
Есть 3 селекта, нужно чтоб в третий выводились данные по запросу по результатам выбора из 2х остальных. Пробую по нажатию на кнопку...

Javascript и ASP. Как спрятать и показать элемент селект в зависимости от определённого выбора?
Ситуация такая есть таблица Продукты (Категория, Продукт) Каждой категории соответствует несколько продуктов Есть страница...

вывод значений из базы в селект
Здравствуйте мне нужна помощь, мне нужно вывести значения из базы в селект, это я сделал, но там задача шире стоит... Дело в том что я...

8
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 15:33
Цитата Сообщение от smilena Посмотреть сообщение
performance_data представляет собой текстовую строку и имеет следующий формат:
...
Нужно распарсить эти строки и получить следующую выборку
Это есть денормализация БД. Не должно одно поле содержать много разных значений. Почему Вы храните их в одной куче, а не в отдельных полях?
0
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
06.10.2011, 15:35  [ТС]
Vovan-VE, ну так вот по дурацки устроена БД нашей системы мониторинга...
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 15:42
smilena, Вынужден Вас огорчить, но ответ - никак. Насколько мне известно, из одной записи никак нельзя получить несколько неизвестно сколько.
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 829
Регистрация: 09.09.2009
Сообщений: 29,554
06.10.2011, 15:54
может запросом вынуть всю строрку, а делить ее уже потом чем-то иным - пхп, перлом, еще чем-то?...
0
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
06.10.2011, 16:07  [ТС]
как-то так...
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
--------------- SQL --------------
mysql> select * from perf//
+---------+------------+---------------------------------------------------------------------------------------+
| host_id | service_id | performance_data                                                                      |
+---------+------------+---------------------------------------------------------------------------------------+
|     101 |        201 | load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0; |
|     102 |        202 | users=0;20;50;0                                                                       |
|     101 |        203 | /=1324MB;6968;7839;0;8710                                                             |
+---------+------------+---------------------------------------------------------------------------------------+
 
delimiter //
DROP FUNCTION IF EXISTS SubNstr;//
CREATE FUNCTION SubNstr(string varchar(255), spliter varchar(5), n integer) RETURNS varchar(255) BEGIN
    SET @C = 0;
    SET @S = 'test';
    SET @S2 = string;
    SET @Offset = n;
    WHILE @C < @Offset DO
        SET @C = @C + 1; 
        IF INSTR(@S2,spliter) = 0 THEN
            SET @S = @S2;
        ELSE
            SET @S = SUBSTRING(@S2,1,INSTR(@S2,spliter)-1); 
        END IF;                 
        SET @S2 = SUBSTRING(@S2,INSTR(@S2,spliter)+1, LENGTH(@S2)); 
    END WHILE;
    RETURN @S;
END//
 
SELECT host_id, service_id, 
        subNstr(subNstr(performance_data,' ',1),'=',1) as 'label', 
        subNstr(subNstr(subNstr(performance_data,' ',1),';',1),'=',2) as 'value', 
        subNstr(subNstr(performance_data,' ',1),';',2) as 'warm', 
        subNstr(subNstr(performance_data,' ',1),';',3) as 'crit', 
        subNstr(subNstr(performance_data,' ',1),';',4) as 'min',
        subNstr(subNstr(performance_data,' ',1),';',5) as 'max'
FROM perf
union
SELECT host_id, service_id, 
        subNstr(subNstr(performance_data,' ',2),'=',1) as 'label', 
        subNstr(subNstr(subNstr(performance_data,' ',2),';',1),'=',2) as 'value', 
        subNstr(subNstr(performance_data,' ',2),';',2) as 'warm', 
        subNstr(subNstr(performance_data,' ',2),';',3) as 'crit',
        subNstr(subNstr(performance_data,' ',2),';',4) as 'min',
        subNstr(subNstr(performance_data,' ',2),';',5) as 'max'     
FROM perf
union
SELECT host_id, service_id, 
        subNstr(subNstr(performance_data,' ',3),'=',1) as 'label', 
        subNstr(subNstr(subNstr(performance_data,' ',3),';',1),'=',2) as 'value', 
        subNstr(subNstr(performance_data,' ',3),';',2) as 'warm', 
        subNstr(subNstr(performance_data,' ',3),';',3) as 'crit',
        subNstr(subNstr(performance_data,' ',3),';',4) as 'min',
        subNstr(subNstr(performance_data,' ',3),';',5) as 'max'     
FROM perf
ORDER BY 1,2//
----------- END SQL ------------
 
Result:
+---------+------------+--------+--------+-------+--------+------+------+
| host_id | service_id | label  | value  | warm  | crit   | min  | max  |
+---------+------------+--------+--------+-------+--------+------+------+
|     101 |        201 | load1  | 0.000s | 5.000 | 10.000 | 0    |      |
|     101 |        201 | load5  | 0.000s | 4.000 | 6.000  | 0    |      |
|     101 |        201 | load15 | 0.000s | 3.000 | 4.000  | 0    |      |
|     101 |        203 | /      | 1324MB | 6968  | 7839   | 0    | 8710 |
|     102 |        202 | users  | 0      | 20    | 50     | 0    | 0    |
+---------+------------+--------+--------+-------+--------+------+------+
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 16:18
smilena, Вы извините, но такой подход напоминает анекдот:
- Как вскипятить чайник?
- Налить воду и включить.
- А как вскипятить полный чайник?
- Вылить воду и перейти в первой задаче.
только у Вас чайник раз по 21 наливается и выливается в каждом из select'ов. Смысла в этом нет, ибо мы каждый раз всё делаем заново по тому же месту. Если бы мы могли одним махом разбить одно значением сразу на N отдельных записей - другое дело. Но мы этого не можем сделать, ибо это не входит в рамки нормального использования БД.

Вам надо Вашу систему мониторинга переделать на корню, чтобы она сразу правильно данные в базу засовывала. А уж после этого единожды раз и навсегда существующие данные в нормальный вид привести.
0
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
06.10.2011, 16:27  [ТС]
Vovan-VE, Вы мне предлагаете Nagios допилить? Сдается мне, это уже пытались сделать до меня, и раз в последних релизах БД до сих пор в таком виде, значит ни к чему не пришли... куда уж мне, глупой девушке))

да, запрос неоптимальный, я поэтому и обратилась с вопросом к людям, которые понимают в этом лучше меня
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 16:34
Цитата Сообщение от smilena Посмотреть сообщение
Вы мне предлагаете Nagios допилить?
О_о В таком случае либо эти данные не имеют такого важного значения (на их взгляд), либо они сами в этом мире чего-то не понимают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2011, 16:34
Помогаю со студенческими работами здесь

Обработка простой формы с ИНПУТи СЕЛЕКТ/Не подхватываются в обработчик переменные СЕЛЕКТ(ОПШНС). Что делать?:-)
Доброй ночи! Помогите, кто чем может:-) Простая форма содержит INPUT и SELECT(OPTIONS).При обработке обработчиком - переменные...

MYSQLi селект из двух значений и странность отображения PHP
Добрый день, сейчас я написал так как ниже и все работает (это загружается аяксом) Но проблема вот в чем. Здесь сейчас тащится только url...

Личная Папка Для Выбора Значений
Привет всем. Исх. данные. Есть бд с огромным массивом данных(клиенты). Прямого доступа из УИ у пользователя нету. Для доступа к...

Хранимая процедура для выбора определённых значений
Доброго времени суток. Понять не могу как написать хранимую процедуру для выбора значений из таблицы по определённому условию CREATE...

Диалоговые окна для выбора и копирования значений в Excel
Доброго времени суток уважаемые знатоки кода. Есть код, который нужно доработать. А именно сделать диалоговые запросы С ПОМОЩЬЮ InputBox...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru