只从子查询中获取完全填充的行(MySQL)

问题描述 投票:0回答:2

我想寻求帮助以创建针对某些问题的优化解决方案。当前的解决方案真的很糟糕而且很慢。

所以,这里是显示示例的最少数据量:

id 地块名称 测量 firmware_revision
1 InboundTraffic1Byte 300 1.5
2 InboundTraffic500Bytes 200 1.5
3 InboundTraffic1000Bytes 100 1.5
4 InboundTraffic1Byte 1.6
5 InboundTraffic500Bytes 200 1.6
6 InboundTraffic1000Bytes 100 1.6

简而言之,有一个 MySQL 数据库存储性能测试的测量值,还有一个 Grafana,它有一些查询来获取绘图的特定数据。假设我有一个入站流量图,显示每个 firmware_revision 的 1B、500B 和 1000B 的所有 3 个入站测量值。所以情节上有 3 行。

在 Grafana 中,我需要获取包含 firmware_revision 和每种测量类型的列:

firmware_revision 入站_1B 入站_500B 入站_1000B
1.5 300 100 200
1.6 200 100

我用这段代码得到它:

SELECT 
  firmware_revision, 
  (SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic1Byte") as inbound_1B,
  (SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic500Byte") as inbound_500B,
  (SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic1000Byte") as inbound_1000B,
FROM 
  db
ORDER BY
  id

现在我想删除缺少任何测量值的行。所以 firmware_revision 1.6 的整行应该消失了。 目前我通过在上面的代码中添加 WHERE 来做到这一点:

WHERE firmware_revision in (SELECT firmware_revision FROM db WHERE ... AND ... AND ... )

所以在......我有一个查询,检查firmware_revision是否在每个测量中。 如果缺少任何内容,则跳过该行。这个解决方案非常慢。你有其他想法吗?有没有更好的方法在不使用子查询的情况下为 Grafan 获取初始数据?

感谢您的帮助:)

mysql sql subquery
2个回答
0
投票

有没有更好的方法让 Grafan 拥有这些初始数据而不用 使用子查询

您可以使用 CASE EXPRESSION 来完成,它比子查询更快:

SELECT 
  firmware_revision, 
  MAX(CASE WHEN Plot_name = 'InboundTraffic1Byte' THEN Measurement END) as inbound_1B,
  MAX(CASE WHEN Plot_name = 'InboundTraffic500Byte' THEN Measurement END) as inbound_500B,
  MAX(CASE WHEN Plot_name = 'InboundTraffic1000Byte' THEN Measurement END) as inbound_1000B
FROM 
  db
GROUP BY
  firmware_revision
HAVING 
  inbound_1B IS NOT NULL AND inbound_500B IS NOT NULL AND inbound_1000B IS NOT NULL;

0
投票

轻微的替代方法是

  • 先过滤掉不为空的记录
  • 应用枢轴(
    MAX
    +
    CASE
    表达式)
  • 记录数为3时检查
SELECT firmware_revision,
       MAX(CASE WHEN Plot_name REGEXP '.*1Byte$'    
                THEN Measurement END) AS inbound_1B,
       MAX(CASE WHEN Plot_name REGEXP '.*500Bytes$'  
                THEN Measurement END) AS inbound_500B,
       MAX(CASE WHEN Plot_name REGEXP '.*1000Bytes$' 
                THEN Measurement END) AS inbound_1000B
FROM tab       
WHERE Measurement IS NOT NULL
GROUP BY firmware_revision
HAVING COUNT(id) = 3

输出

firmware_revision 入站_1B 入站_500B 入站_1000B
1.5 300 200 100

在这里查看演示.

© www.soinside.com 2019 - 2024. All rights reserved.