在 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 语句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL获取序列号范围

如何用java控制每次从数据库中读取1000条数据到List中?

mysql中的慢查询会不会影响速度

最小堆_最大堆

优化了MYSQL大量写入问题,老板奖励了1000块给我

查找读取 1000 字节文件所需的时间 [关闭]