首页 > 解决方案 > 创建 MySQL 过程

问题描述

我的目标是使用 MySQL 过程来实现,其中数据将从表中查询,并且一些其他相关数据也必须从同一个表中获取。如果有人可以帮助我,我将不胜感激。

这是表格的样子:

+----------+------------+-----------+----------+----------+------+
| id       | src_ip     | dst_ip    | src_port | dst_port | data | 
+----------+------------+-----------+----------+----------+------+
| 12000000 |     796928 | 1911291904|       14 |     2048 |   64 | 
| 12000001 |     796933 |  316866560|       14 |     2048 |  126 | 
| 12000002 |     796946 | 4081388040|    49155 |    45338 |  122 | 
| 12000003 |     796951 | 3085830664|    36108 |    49155 |  146 | 
| 12000004 |     796946 | 4081388040|       14 |     2048 |  150 | 
| 12000005 |     796950 | 3085830664|    45338 |    49155 |  194 | 
+----------+------------+-----------+----------+----------+------+

这里要提取的数据如下:

query_get = "select distinct(src_ip), dst_ip from user_activity_load"

这给了我与 dst_ip 不同的 src_ip 通信。有点像:

+--------+------------+
| src_ip | dst_ip     |
+--------+------------+
| 796928 | 1911291904 |
| 796928 | 1911294472 |
| 796933 |  316866560 |
| 796946 | 1925840896 |
| 796946 | 4081385472 |
| 796946 | 4081388040 |
+--------+------------+

现在,将分别获取和查询这一行中的每一行,以便获取发生data的所有通信的部分,并将它们添加到单独的表中,这将是我的最终结果。

+--------+------------+------+
| src_ip | dst_ip     | data |
+--------+------------+------+
| 796928 | 1911291904 |   64 |
| 796928 | 1911291904 |   64 |
| 796928 | 1911291904 |   64 |
| 796928 | 1911291904 |   64 |
| 796928 | 1911291904 |   64 |
+--------+------------+------+

这将是我的最终结果表,我希望在运行所有查询后实现它并作为输出

+------------+------------+------+
| src_ip     | dst_ip     | data |
+------------+------------+------+
| 796928     | 1911291904 |   320|
| 796933     |  316866560 |  1240|
| 796933     |  316866560 |  1029|
| 27969233   |  312322311 | 11780|
| 316866560  | 1192808377 | 21450|
| 8596933    |  316866560 |  1320|
+------------+------------+------+

在它们之间发生的所有通信中使用的所有数据都可以看到所有独特的通信。因为我不擅长编写 MySQL 程序,所以我尝试过的事情并没有给我想要达到的结果,而且因为我不是数据库专家,但是因为我需要完成这件事,所以我确实尝试了一些事情在自己尝试之前寻求帮助是不合理的。这是我尝试过的东西:

CREATE procedure getIPActivity(
 )
 begin
  DECLARE src_ip text;
  DECLARE dst_ip text;
  DECLARE x INT;
  DECLARE data INT;
  DECLARE sip varchar(20)
  DECLARE dip varchar(20)
  DECLARE cnt INT;
  SET data = 0;
  select
    distinct(INET_NTOA(ui.src_ip)) into @src, INET_NTOA(ui.dst_ip) into @dst from
    user_activity_load as ui limit 100;
  SET sip = @src;
  SET dip = @dst;


select
    count(*) into @count from user_activity_load where src_ip = sip and dst_ip = dip; 
    SET cnt = @count;
      REPEAT
     SET data = data + (select data from user_activity_load where src_ip = sip and dst_ip = dip);
     SET  x = x + 1;
            UNTIL x  > cnt
            END REPEAT;
      select
        distinct(INET_NTOA(ui.src_ip)) as src_ip, INET_NTOA(ui.dst_ip) as dst_ip, data from
        user_activity_load as ui limit 100;
    end ;;
    delimiter ;

再说一次,因为我不是一个非常擅长 MySQL 程序的人,所以我尝试了它并失败了。我的目标很明确,怎么做也很明确,但我不能为此编写程序。如果有人可以在这里帮助我,我将非常感激。提前致谢。

PS:我输入的查询结果与我的示例表数据略有不同,因为我在src_ip和上放入了索引dst_ip

标签: mysqlstored-procedures

解决方案


只是一个猜测:-

 select t.src_ip,t.dst_ip, sum(data) sumdata
    -> from t
    -> group by t.src_ip,t.dst_ip;
+--------+------------+---------+
| src_ip | dst_ip     | sumdata |
+--------+------------+---------+
| 796928 | 1911291904 |      64 |
| 796933 | 316866560  |     126 |
| 796946 | 4081388040 |     272 |
| 796950 | 3085830664 |     194 |
| 796951 | 3085830664 |     146 |
+--------+------------+---------+
5 rows in set (0.00 sec)

推荐阅读