【问题标题】:Add INNER JOIN to my MySQL query so i can use DISTINCT将 INNER JOIN 添加到我的 MySQL 查询中,以便我可以使用 DISTINCT
【发布时间】:2019-03-18 06:03:56
【问题描述】:

我正在使用 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

映射

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

我写了一个查询来给我手机的型号和该型号的数量,但它正在计算重复项。有人告诉我我需要添加一个 INNER JOIN,但我不知道该怎么做。有人可以帮我更改我的查询以对“Items”表进行 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

谢谢!

** UPDATE ** 使用 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;

【问题讨论】:

  • 为什么不阅读关于 JOIN 的文章,然后再回复我们
  • 嘿草莓...自从你建议以来,我整个周末都在阅读 JOINS,并且一直在尝试弄清楚如何使用它们,但我仍然卡住了。我尝试了 w3school、sqlcourse,只是在这里阅读了其他答案,但我似乎无法将我的查询转换为使用 JOIN 的查询。
  • 连接表确实没有太多意义,您不能从中选择任何列 - 尽管在这种情况下 huint 和 i 都呈现为 INNER JOIN

标签: mysql grafana zabbix


【解决方案1】:

这是您使用 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;

现在,如需进一步帮助,请参阅 Why should I provide an MCVE for what seems to me to be a very simple SQL query?

【讨论】:

  • 非常感谢您在这方面与我合作。这对我非常有帮助。我需要弄清楚的唯一部分是如何为 i.itemid 合并 DISTINCT ...您有什么机会可以帮助我吗?我在这里尝试过,但它抛出错误 FROM hosts h LEFT JOIN (SELECT DISTINCT itemid FROM items) i ON h.hostid=i.hostid
  • 我认为这不是您所需要的。因此,为什么我建议您采用替代策略来解决您的问题,在上面的链接中有详细概述。
  • 好的,我在 DB Fiddle 上进行了一个共享会话,如果你有机会查看它db-fiddle.com/f/b2o3Wy31hLmwSZLAfpuaVr/…
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2022-11-16
  • 2012-11-02
  • 1970-01-01
  • 2011-09-25
  • 2022-01-21
  • 1970-01-01
  • 2022-11-07
相关资源
最近更新 更多