我是MySQL和PHP的新手。通常我需要一点语言的帮助,然后我可以从那里开始。所以我真的很感激我的第一个“复杂”问题的帮助。我有下面的数据库,其中包含有关网络的数据,并且每五分钟填充一次。 MAC地址是唯一真正的静态值,因为它附加到硬件(make),因此它可以用作密钥。其他一切都可能发生变化。这是我的数据库的截断样本。有时每次都会有更多或更少的行。
我一直在使用PHP前端来显示数据,我想要添加的一个功能是比较列出的IP,以及从最新时间到上一次的MAC-IP对。如果IP与当前时间相比存在或不存在,则获取这些行。此外,如果MAC切换到不同的IP或IP切换到不同的MAC,也可以获取这些行。
基本上,这些是我用来获取数据以便在PHP中显示的一些查询,但它们只是非常基本的,只是显示表中的内容。谢谢你,我感谢你的帮助。任何答案都会帮助我学到很多东西,在此之后我应该能够自己找到更多。谢谢!
/* Get all results for Today's Date */
$result = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' ORDER BY date DESC,time DESC") or die('Error with mysql_query');
$CurrentLogTime = $row['time']; // Variable set to time field of first row.
/* Get all results for Today's Date and most recent log time. */
$result2 = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' and time = '$CurrentLogTime'") or die('Error with result2');
/* Get all results for Today's Date and previous log time. */
$result3 = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' and time = TIMEDIFF ('$CurrentLogTime', '00:05')") or die('Error with result3');
+------------+----------+----------------------+-------------------+------+------+----------------------+-------+------+--------+-------+------+
| date | time | ip | mac | name | dns | make | owner | note | status | specs | os |
+------------+----------+----------------------+-------------------+------+------+----------------------+-------+------+--------+------+-------+
| 2012-08-22 | 00:00:00 | 192.168.30.1 | 00:00:00:00:00:00 | NULL | NULL | Supermicro Computer | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:00:00 | 192.168.30.10 | BB:BB:BB:BB:BB:BB | NULL | NULL | Generic Server | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.1 | 11:11:11:11:11:11 | NULL | NULL | Supermicro Computer | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.2 | 00:50:56:A4:52:5E | NULL | NULL | VMware | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.3 | 00:0A:9C:52:88:8C | NULL | NULL | Server Technology | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.10 | BB:BB:BB:BB:BB:BB | NULL | NULL | Generic Server | NULL | NULL | NULL | NULL | NULL |
作为澄清我想要做的事情的一个例子。我总是希望我的HTML / PHP前端显示最新日期和时间的行。如果我们使用上面的示例,我希望我的用户在浏览到网页时看到00:05的所有行。这很容易。现在让我们说在00:00,我有MAC 00:00:00:00:00:00配对,最高可达192.168.30.1。但是在00:05,MAC 11:11:11:11:11:11取得了192.168.30.1。我想在HTML中突出显示该行。另外,假设在00:00,当时唯一的IP是192.168.30.1和192.168.30.10。但是在00:05,不仅有192.168.30.1和.10,还有192.168.30.2和192.168.30.3。我想强调在00:05出现的新IP行。最后,我们看到192.168.30.10的IP-MAC对在两次之间是相同的。我仍然希望在生成最终用户表时回显这个,但我不想以任何方式突出显示它。因此,最终结果应该是生成类似这样的东西的网页,其中IP-MAC组合从前一次改变为粗体。
| 2012-08-22 | 00:05:00 | 192.168.30.1 | 11:11:11:11:11:11 | NULL | NULL |超微电脑| NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.2 | 00:50:56:A4:52:5E | NULL | NULL | VMware | NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.3 | 00:0A:9C:52:88:8C | NULL | NULL |服务器技术| NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.10 | BB:BB:BB:BB:BB:BB | NULL | NULL |通用服务器| NULL | NULL | NULL | NULL |空|
当确定已更改的行时,我不知道最好是使用MySQL还是只获取最新的两个更新的行并使用PHP来找出已更改的内容?请记住,我的实际数据库每次将有超过100个条目。
从逻辑上讲,这里有一些关于我想要做的事情的更多细节。基本上,使用上面的例子,我想创建两个数组进行比较。虽然我还在研究,但我已经想出如何将这两个字段用于比较但不知道从哪里开始。这对我来说非常令人沮丧,因为我可以轻松地使用shell脚本获取这些结果并将它们直接输入数据库。我试图在PHP和MySQL中尽可能多地做,但是让我的shell脚本想出这个想法变得更加开胃。但基本上这就是我正在尝试用上面的表格,但我甚至不知道最好是使用MySQL或PHP进行操作。 >。<
Array1
mac | ip
00:00:00:00:00:00 | 192.168.30.1
BB:BB:BB:BB:BB:BB | 192.168.30.10
Array2
mac | ip
11:11:11:11:11:11 | 192.168.30.1
00:50:56:A4:52:5E | 192.168.30.2
00:0A:9C:52:88:8C | 192.168.30.3
BB:BB:BB:BB:BB:BB | 192.168.30.10
WHERE Array1.ip == Array2.ip或Array1.mac == Array2.mac
做
CONCAT Array1.ip,Array1.mac = Compare1和CONCAT Array2.ip,Array2.mac = Compare2
如果Compare1!= Compare2
然后
将行回显为粗体
答案 0 :(得分:0)
使用单独的date
和time
字段不会对您有所帮助。除非您需要按天执行报告,否则您应该只有一个datetime
,在这种情况下,date
与创建相应的索引相关。请注意,尽量避免在内部SQL类型之后命名列。 date
可以是on_date
而time
可以at_time
只是为了消除混淆。作为一个加号,这些在查询中使用时不必转义。
使用名为datetime
的已编入索引的created_At
字段,您可以ORDER BY created_at DESC
在尝试确定是否发生了更改时,您可能需要BETWEEN
。
您还可以使用{{1}}运算符选择日期时间值的范围,以便检查特定时间间隔内的更改。
您要求的内容并不完全清楚,因此您可能需要更具体,或者尝试重新构建这些内容,以便查询变得更加明显。