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