Добавить INNER JOIN в мой запрос MySQL, чтобы я мог использовать DISTINCT - PullRequest
0 голосов
/ 18 марта 2019

Я работаю с 4 таблицами - Предметы, Хосты, История, Отображения

Предметы

hostid,itemid,name,valuemapid
10761,304827,Phone 33 44 55 66 77 88:Model of the Phone,68
10761,304827,Phone 33 44 55 66 77 88:Model of the Phone,68
10761,304827,Phone 33 44 55 66 77 88:Model of the Phone,68
10761,304828,Phone 33 44 55 66 88 88:Model of the Phone,68
10761,304828,Phone 33 44 55 66 88 88:Model of the Phone,68
10761,304828,Phone 33 44 55 66 88 88:Model of the Phone,68
10761,304829,Phone 33 44 55 77 77 88:Model of the Phone,68
10761,304829,Phone 33 44 55 77 77 88:Model of the Phone,68
10761,304820,Phone 33 44 44 66 77 88:Model of the Phone,72
10761,304820,Phone 33 44 44 66 77 88:Model of the Phone,72

Хосты

hostid,name
10761,CUCM2

история

itemid,value
304827,109
304828,109
304829,109
304829.110

mappings

valuemapid,value,newvalue
68,109,Cisco 7841
72,110,Cisco 7940

Я написал запрос, чтобы дать мне модель телефона и счет для этой модели, но он подсчитывает дубликаты.Мне сказали, что мне нужно добавить INNER JOIN, но я не знаю, как это сделать.Может ли кто-нибудь помочь мне изменить мой запрос на ВНУТРЕННЕЕ СОЕДИНЕНИЕ для таблицы «Элементы», чтобы удалить все дубликаты ItemID.

SELECT map.newvalue as 'Model of Phone', Count(*) as 'Number of Phones'
FROM items i, hosts h, history huint, mappings map
WHERE h.hostid=i.hostid AND h.name='$Hosts' AND i.itemid=huint.itemid AND i.valuemapid=map.valuemapid AND huint.value=map.value AND i.name LIKE '%Model of the Phone'
GROUP BY map.newvalue
LIMIT 100;

Возвращает

Model of Phone, Number of Phones
Cisco 7841, 8
Cisco 7940, 2

Спасибо!

** ОБНОВЛЕНИЕ ** Использование LEFT JOIN, но не могу понять, как использовать DISTINCT

SELECT map.newvalue as 'Model of Phone', Count(*) as 'Number of Phones'
FROM hosts h
    LEFT JOIN items i
        ON h.hostid=i.hostid
    LEFT JOIN history_uint huint
        ON i.itemid=huint.itemid
    LEFT JOIN mappings map
        ON i.valuemapid=map.valuemapid
WHERE h.name='$Hosts' AND huint.value=map.value AND i.name LIKE '%Model of the Phone'
GROUP BY map.newvalue
ORDER BY 'Item Name' DESC
LIMIT 100;

1 Ответ

1 голос
/ 18 марта 2019

Вот ваш запрос, переписанный с использованием синтаксиса после 1992 года ...

SELECT m.newvalue 'Model of Phone'
     , Count(*) 'Number of Phones'
  FROM items i
  JOIN hosts h
    ON h.hostid = i.hostid 
  JOIN history y
    ON y.itemid = i.itemid
  JOIN mappings m
    ON m.valuemapid = y.valuemapid 
   AND y.value = m.value
 WHERE h.name = '$Hosts' -- this is insecure
   AND i.name LIKE '%Model of the Phone' -- and this cannot use an index 
 GROUP 
    BY m.newvalue
 ORDER
    BY m.newvalue
 LIMIT 100;

Теперь для получения дополнительной помощи см. Почему я должен предоставить MCVE для того, что мне кажется очень простымSQL-запрос?

...