我是新来的。所以,对我来说很容易。我有一个名为'data'的表,其中一列是以YYYY-MM-DD格式存储的'date'。这是我一直在研究的代码。基本上,我想要做的是比较我表中存储的两个日期是否相等。但是,每次运行代码时,我都会收到错误:未定义的偏移量,代码为$ lisdate [$ i + 1]。如何比较表中存储的日期?谢谢。
我的代码
$sth2 = mysql_query("SELECT * FROM data WHERE dest_name='www.myren.net.my'");
while($rowstemp = mysql_fetch_assoc($sth2))
{
$lisdate[] = $rowstemp['date'];
$lisaverage[] = $rowstemp['avg_rtt'];
}
$rows = mysql_num_rows($sth2);
$addAverage[0] = $lisaverage[0];
$numbers = 0;
$j = 0;
for($i = 0; $i<$rows; $i++)
{
if($lisdate[$i] == $lisdate[$i+1])
{
$addAverage[$j] = $addAverage[$j] + $lisaverage[$i+1];
}
else
{
$j++;
$numbers = $numbers +1;
}
}
答案 0 :(得分:2)
; $i < $rows - 1;
以更正此问题。
但是,你有另一个问题。除非您的查询包含ORDER BY子句,否则结果集中的SQL行具有不可预测的顺序。如果没有该子句的这些行按date
按升序显示,那就是运气不好。将ORDER BY date
放入查询中。
答案 1 :(得分:0)
问题中的代码试图实现的目标尚不完全清楚。
(正如Ollie在他的回答中指出的那样,重复一遍:如果查询中有ORDER BY
子句,那么MySQL返回行的顺序将保证 ONLY 。 “重复日期”检查在代码中执行的只会检测到“重复”日期值,如果它出现在连续的行上。)
我们看到代码使用查询返回的date
和avg_rtt
列值加载了几个数组。然后在数组上有一些操作...最终结果将是另一个不清楚该rigmarole的实际意图是什么,它实际上试图实现什么。
如果有任何行看起来会有另一个数组......如果找不到“重复”的日期值,它将会有一个元素(值为rtt_avg
来自第一行),$numbers
将设置为原始数组中的元素数。
如果找到“重复”的日期值,代码的结果对我来说似乎很奇怪,一个人口稀少的数组。为什么呢?
就个人而言,我希望获得规范的实际声明,让数据库为我做处理,而不是通过两个数组。
如果我们想要的是一组没有重复日期值的值,我会使用GROUP BY
和一些聚合,例如:
SELECT d.dest_name
, d.date
, AVG(d.avg_rtt) AS avg_avg_rtt
, MAX(d.avg_rtt) AS max_avg_rtt
, MIN(d.avg_rtt) AS min_avg_rtt
, SUM(d.avg_rtt) AS sum_avg_rtt
, COUNT(1) AS cnt
, COUNT(d.avg_rtt) AS cnt_avg_rtt
, COUNT(DISTINCT d.avg_rtt) AS cnt_distinct_avg_rtt
FROM data d
WHERE d.dest_name = 'www.myren.net.my'
GROUP
BY d.dest_name
, d.date
ORDER
BY d.dest_name
, d.date
如果我只查找不同date
值的计数,例如$numbers
将包含的值,那么只需:
SELECT d.dest_name
, COUNT(DISTINCT d.date) AS cnt_distinct_date
FROM data d
WHERE d.dest_name = 'www.myren.net.my'
GROUP BY d.dest_name
ORDER BY d.dest_name
“循环数组”,原始查询只是看起来像实现结果的奇怪方式,无论结果是什么。