Ad Widget

Collapse

SQL запрос в БД заббикса

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • atraides
    Member
    • Nov 2017
    • 61

    #1

    SQL запрос в БД заббикса

    Добрый день, уважаемое коммюнити заббикса, подскажите пожалуйста, есть задача получить с помощь 1 sql запроса на вывод некую таблицу с именем хоста и последним значением элемента данных. В sql я полный новичок, получилось сделать подобное 4мя разными запросами,

    $host = SELECT name FROM hosts (получаем список хостов)

    $hostid = SELECT hostid FROM hosts WHERE name like '%$host%'; (используя полученный список хостов, определяем hostid)

    $itemid = SELECT itemid FROM items WHERE hostid = '$hostid' AND name = 'CertExpDate_complex'; ( По полученному списку hostid находим ITEMID с нужным именем элемента данных)

    SELECT value FROM history_text WHERE itemid = '$itemid' order by clock DESC limit 1; (Уже по полученному списку ITEMIDs запрашиваем самое последнее новое значением)

    Есть возможность это уложить в 1 запрос?
    Last edited by atraides; 24-06-2019, 14:32.
  • Etelereth
    Junior Member
    • Jun 2019
    • 1

    #2
    SELECT hi.value, hi.clock
    FROM hosts h
    JOIN items i on i.hostid = h.hostid
    JOIN history_text hi on hi.itemid=i.itemid
    WHERE
    i.name = 'CertExpDate_complex'
    and h.name like '%$host%'
    ODER BY hi.clock DESC LIMIT 1

    Работает для postgres, если база большая, то запрос может выполняться долго.

    Comment

    • atraides
      Member
      • Nov 2017
      • 61

      #3
      @Etelereth Спасибо за ответ, сейчас задача немного поменялась, пытаюсь получить в 1 запросе, таблицу с 3 колонками - имя хоста, последнее значение элемента данных , время
      Перепробовал много вариантов, так не один не подошел , помогите плиз кто знает
      SELECT hosts.name,history_text.value,FROM_UNIXTIME(histor y_text.clock) as clock
      FROM hosts
      JOIN hosts_groups ON (hosts_groups.hostid=hosts.hostid AND hosts_groups.groupid="120") #фильтруем хосты с ID группы 120
      JOIN items ON (items.hostid=hosts.hostid AND items.name="ComplexVersion") #фильтруем элементы данных по имени ComplexVersion
      JOIN history_text ON history_text.itemid=items.itemid #добавляем значения элемента данных с указанных хостов
      ORDER BY name,clock DESC
      Получаю на вывод таблицу где подряд идут хосты с значением элемента данных по времени
      Click image for larger version

Name:	value_1.jpg
Views:	588
Size:	91.7 KB
ID:	381790

      Пытаюсь получить самые последние значения элемента данных , фильтруя по столбцу clock , но нечего не получается
      Click image for larger version

Name:	value_2.jpg
Views:	577
Size:	32.6 KB
ID:	381791

      SELECT hosts.name,history_text.value,max(FROM_UNIXTIME(history_text.clock)) as clock
      FROM hosts
      JOIN hosts_groups ON (hosts_groups.hostid=hosts.hostid AND hosts_groups.groupid="$group_id")
      JOIN items ON (items.hostid=hosts.hostid AND items.name="ComplexVersion")
      JOIN history_text ON history_text.itemid=items.itemid
      group by name
      ORDER BY name,clock DESC

      Comment

      • Alex_UUU
        Senior Member
        • Dec 2018
        • 541

        #4
        Стоит ли делать запросы в БД?
        Тоже всегда порываюсь, т.к. это самый простой и эффективный способ :-) Но все же.
        Предлагаю работать с БД через АПИ заббикса. и вот если оттуда никак - то только тогда через БД.

        Comment

        • atraides
          Member
          • Nov 2017
          • 61

          #5
          Через API принцип получения инфы особо не отличается в данном случае, будут 3 запроса с получением всех этих ID и дальнейшим их сопоставлением((( У меня то запрос принципе готов, только вот придумать как отсортировать по последнему значению CLOCK не как не могу

          Comment

          • Victor Vislobokov
            Senior Member
            • Aug 2018
            • 298

            #6
            Так вы же сами указали 2-е правило сортировки: ORDER BY name,clock
            Вот он и сортирует как заказли, спрерва по имени, потом по времени. Хотите сортировать по времени - уберите name

            Comment

            • atraides
              Member
              • Nov 2017
              • 61

              #7
              Originally posted by Victor Vislobokov
              Так вы же сами указали 2-е правило сортировки: ORDER BY name,clock
              Вот он и сортирует как заказли, спрерва по имени, потом по времени. Хотите сортировать по времени - уберите name
              Переделал как вы сказали, :
              SELECT hosts.name,history_text.value,max(FROM_UNIXTIME(hi story_text.clock)) as clock
              FROM hosts
              JOIN hosts_groups ON (hosts_groups.hostid=hosts.hostid AND hosts_groups.groupid="$group_id")
              JOIN items ON (items.hostid=hosts.hostid AND items.name="ComplexVersion")
              JOIN history_text ON history_text.itemid=items.itemid
              GROUP BY name
              ORDER BY clock DESC
              В результате значения элемента данных value не являются последними по факту, хотя дата clock стоит последняя, т.е происходит ошибка что ли в сопоставлении последней даты - и последнего значения элемента данных
              Что в общем итоге я хотел получить с помощью SQL Запроса - аналог Последних данных в забиксе

              Click image for larger version  Name:	last2.png Views:	3 Size:	82.8 KB ID:	381880
              Click image for larger version  Name:	last.png Views:	1 Size:	73.7 KB ID:	381878
              Attached Files
              Last edited by atraides; 06-07-2019, 21:39.

              Comment

              • Victor Vislobokov
                Senior Member
                • Aug 2018
                • 298

                #8
                А не подскажете, что вы хотите добиться с помощью GROUP BY name?

                Comment

                • atraides
                  Member
                  • Nov 2017
                  • 61

                  #9
                  Оставить в колонке name по 1 уникальному имени хоста соответственно с последним значением value и clock.
                  Тут в процессе гугления наткнулся на то что раньше в таблице items была колонка lastvalue, это как раз то что мне нужно... как удобно можно было получить искомый результат... но потом почему то убрали это. Сейчас подобная колонка есть разве что в api items.get ... аналогично lastvalue... Видимо придется смотреть в сторону API все таки и отказаться от sql запроса.
                  Click image for larger version

Name:	zab_012.jpg
Views:	606
Size:	147.7 KB
ID:	381948

                  Comment

                  • Victor Vislobokov
                    Senior Member
                    • Aug 2018
                    • 298

                    #10
                    GROUP BY не оставляет в колонке одно имя, этот оператор ГРУППИРУЕТ записи по значению определённого поля, используя для группировки подсчёт по агрегатной функции. У MySQL оператор GROUP BY работает как-то странно. В PostgreSQL, например, вам бы просто не дало сгруппировать строки по полю, на котором нет агрегатной функции, а вот MySQL позволяет. Но результат от этого становится совсем не тем, что ожидался.

                    Comment

                    • atraides
                      Member
                      • Nov 2017
                      • 61

                      #11
                      Нашел еще пост https://alex.mamchenkov.net/2015/01/...history-items/, здесь человек с такой задаче столкнулся, вывести в таблице последние значения по хостам.
                      попробовал предложенный им вариант c подзапросом:
                      SELECT * FROM (SELECT hosts.name,history_text.value
                      FROM hosts,items,history_text,hosts_groups
                      WHERE hosts_groups.groupid = "94" AND hosts_groups.hostid=hosts.hostid AND items.hostid=hosts.hostid AND history_text.itemid=items.itemid
                      AND items.name LIKE 'ComplexVersion%' AND history_text.value <> '' ORDER BY history_text.clock DESC) tmp_table
                      GROUP BY name;
                      Но почему то эффект примерно тот же( вывод не тот(
                      PS У меня mysql mariadb стоит

                      Comment

                      Working...