创建MySQL过程

时间:2019-02-05 08:01:13

标签: mysql stored-procedures

我的目标是使用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_ipdst_ip上添加了索引,因此我查询的结果与示例表数据有些不同。

1 个答案:

答案 0 :(得分:1)

一个猜测:-

 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)