在 mySQL 数据库中读取 >1000 个值的 SQL 语句
Posted
技术标签:
【中文标题】在 mySQL 数据库中读取 >1000 个值的 SQL 语句【英文标题】:SQL Statement to read >1000 values in mySQL database 【发布时间】:2019-04-17 22:40:43 【问题描述】:我目前有一个 SQL 选择语句,它成功地执行了以下操作,它提供了过去两天的状态:
SELECT c.host, from_unixtime(a.clock), a.value, b.name
FROM
zabbix.history_uint a,
zabbix.items b,
zabbix.hosts c,
zabbix.groups g,
zabbix.hosts_groups hg
WHERE c.hostid = hg.hostid
AND g.groupid = hg.groupid
AND b.itemid=a.itemid
AND b.hostid=c.hostid
AND (b.name = "nodeAlive")
AND a.clock > 1539489622
AND c.host = "LONDON01";
输出:
+------------+------------------------+-------+-----------+
| host | from_unixtime(a.clock) | value | name |
+------------+------------------------+-------+-----------+
| LONDON01 | 2018-11-13 00:15:35 | 1 | nodeAlive |
| LONDON01 | 2018-11-14 00:15:35 | 1 | nodeAlive |
| LONDON01 | 2018-11-13 00:15:35 | 1 | nodeAlive |
| LONDON01 | 2018-11-14 00:15:35 | 1 | nodeAlive |
| LONDON01 | 2018-11-13 00:15:35 | 1 | nodeAlive |
| LONDON01 | 2018-11-14 00:15:35 | 1 | nodeAlive |
+------------+------------------------+-------+-----------+
我现在需要查找 MADRID03、TORONTO52、NEWYORK77 和 >1000 台其他主机的状态。
是否可以从文本文件执行此操作并输出到另一个文件?如果是这样,如何修改语法?
感谢并感谢它
【问题讨论】:
你是否得到前两天表中所有主机的状态?或者> 1000 other hosts
只是表中所有主机的一个子集?根据您的输出示例,您真的想要重复的结果吗?这些可以使用SELECT DISTINCT...
过滤。
啊!我想要所有 1000 多个主机的状态。有重复的输出是可以的,尽管我将继续调整语句以包含 DISTINCT。
我想避免在 SELECT DISTINCT 语句中输入 1000 多个主机
您是否使用 php 之类的语言来执行此操作?
我没有使用 PHP(也不知道如何使用)。我正在使用纯 SQL 语句
【参考方案1】:
改变不是那么简单
AND c.host = "LONDON01"
到
AND c.host IN ("LONDON01", "MADRID03", "TORONTO52", "NEWYORK77", "TORONT9999", ...)
或者,也许将 1000 多个名称放在一个表中并执行 JOIN
会更容易?或者你已经在一个表中?
你有没有想过输出中有多少行?
你可以(为了编码简单)改变
a.clock > 1539489622
到
a.clock > NOW() - INTERVAL 2 DAY
(如果您想在午夜开始,请使用... >= CURDATE() ...
)
似乎没有理由将JOIN
转为groups
。
【讨论】:
“似乎没有理由加入群组。” - 加入群组会淘汰没有群组的主机。 好的,所以我的解决方案是将 1500 个主机粘贴到 Excel 中,使它们都位于“B”列下。然后将 从 A1 粘贴到 A1500。将 从 C1 粘贴到 C1500。然后将 从 D1 粘贴到 D1500。然后从 E1 到 E1500 执行“=CONCATENATE(A1,B1,C1,D1)”。然后将 E1 复制到 E1500 并将特殊值粘贴到新工作表中 - > Sheet2。从 Sheet2 中,我复制了 1500 个单元格,其中包括带有引号和逗号的主机名,并将特殊转置粘贴到另一个 Sheet --> Sheet3。 从这里,我复制了该行并粘贴到 SELECT 语句中,这样它就是 .... AND c.host IN ("LONDON01", "MADRID03", TORONTO52", ..... )。这有点蛮力,但它奏效了。感谢 fubar 和 Rick James @stitch70 - 也许真正的解决方案是放弃 Excel? @RickJames 同意,理想情况下我不想使用 Excel,而是喜欢使用输入文件【参考方案2】:您可以将服务器列表读入临时表并执行子查询。
CREATE TEMPORARY TABLE servers (name varchar(100)) ENGINE=MEMORY ;
LOAD DATA LOCAL INFILE '/path/to/your/server/listfile' INTO TABLE servers;
SELECT ..... AND c.host IN (SELECT name FROM servers);
如果您的服务器列表不经常更改,您可以将您的表永久化并在需要时更新。
【讨论】:
以上是关于在 mySQL 数据库中读取 >1000 个值的 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章