Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在PHP循环中连接最近的数据库行_Javascript_Php_Jquery_Mysql_Row - Fatal编程技术网

Javascript 在PHP循环中连接最近的数据库行

Javascript 在PHP循环中连接最近的数据库行,javascript,php,jquery,mysql,row,Javascript,Php,Jquery,Mysql,Row,让我们假设我有一个像这样的MySQL结构 +--------------+--------------------+-------------------+ | tdate | tuser | tvalue | +--------------+--------------------+-------------------+ | 11:16:48 | John | 10

让我们假设我有一个像这样的MySQL结构

+--------------+--------------------+-------------------+
| tdate        | tuser              | tvalue            |
+--------------+--------------------+-------------------+
| 11:16:48     | John               | 10                |
+--------------+--------------------+-------------------+
| 11:16:38     | John               | 40                |
+--------------+--------------------+-------------------+
| 11:16:28     | Lisa               | 50                |
+--------------+--------------------+-------------------+
| 10:16:48     | Lisa               | 20                |
+--------------+--------------------+-------------------+
下面是一个php查询:

<?php
$username =  'test';
$sql=mysqli_query($db,"SELECT * FROM t ORDER BY tid DESC LIMIT 20");
while($row=mysqli_fetch_array($sql))
{
    $tuser= $row['tuser'];
    $tvalue= $row['tvalue'];
    $tdate= $row['tdate'];
    ?>
    <div id="<?php echo $tvalue; ?>" class="message_box">
        <?php echo $tdate; ?> -
        <?php echo $tvalue; ?> -
        <?php echo $tuser; ?>
    </div>
    <?php
} 
?>
2016-02-22 11:16:48 - 10 - John
2016-02-22 11:16:38 - 40 - John
2016-02-22 11:16:28 - 50 - Lisa
2016-02-22 10:16:48 - 20 - Lisa
2016-02-22 11:16:48 - 50 - John
2016-02-22 11:16:28 - 50 - Lisa
2016-02-22 10:16:48 - 20 - Lisa
我希望看到它是这样的:

<?php
$username =  'test';
$sql=mysqli_query($db,"SELECT * FROM t ORDER BY tid DESC LIMIT 20");
while($row=mysqli_fetch_array($sql))
{
    $tuser= $row['tuser'];
    $tvalue= $row['tvalue'];
    $tdate= $row['tdate'];
    ?>
    <div id="<?php echo $tvalue; ?>" class="message_box">
        <?php echo $tdate; ?> -
        <?php echo $tvalue; ?> -
        <?php echo $tuser; ?>
    </div>
    <?php
} 
?>
2016-02-22 11:16:48 - 10 - John
2016-02-22 11:16:38 - 40 - John
2016-02-22 11:16:28 - 50 - Lisa
2016-02-22 10:16:48 - 20 - Lisa
2016-02-22 11:16:48 - 50 - John
2016-02-22 11:16:28 - 50 - Lisa
2016-02-22 10:16:48 - 20 - Lisa
这意味着,如果新行是在60秒内创建的(对于同一用户),则循环必须对值进行求和。。Lisa有两行,但因为有一个小时的时间戳差异,所以必须像往常一样列出它。。。它需要它自动更新automaticaly,这意味着它最初会显示John的值为40,但在添加新行的10秒后,它必须相应地更新为50。还有一个问题是MYSQL查询限制为20,这可能会将60秒内插入的行拆分,并给出错误的总值计算。。我知道这很难,但有人有简单的解决办法吗

多亏了Asur,我现在有了:

SELECT ROUND(UNIX_TIMESTAMP(tdate) DIV 60) AS time,tuser,SUM(tvalue) 
FROM t 
GROUP BY EXTRACT(DAY_HOUR FROM tdate),tuser 
ORDER BY tid DESC 
LIMIT 20;
但是问题是,如果最后一个数据库行是JOHN,那么如果在同一小时内已经有一个JOHN行在该行之上,那么他将不会列在最后

IF I HAVE: 
JOHN 10 
GEORGE 10 
GEORGE 10 
JOHN 10 

It will list: 
JOHN 20 
GEORGE 20 

And it should be the other way arround, where the last row counts: 
GEORGE 20 
JOHN 20
替换此查询:

SELECT * FROM t ORDER BY tid DESC LIMIT 20
为此:

SELECT tdate , sum(tvalue), tuser FROM t 
group by tuser, DATE_FORMAT(tdate , '%Y-%m-%d %h:%i') 
ORDER BY tid DESC LIMIT 20

我建议您直接在sql查询中执行以下操作:

SELECT ROUND(UNIX_TIMESTAMP(tdate) DIV 60) AS time,tuser,SUM(tvalue)       
FROM t
GROUP BY time,tuser
ORDER BY tid DESC 
LIMIT 20;  

就优化和花费的时间而言,这要好得多。

感谢您的努力:)。。。它成功地将行分组,但时间元素不起作用。。此解决方案汇总了所有行中用户的tvalue。。我想它组它只为60秒的时间框架,例如。。。这意味着,如果在这段时间内还有其他用户,同一个用户将被多次列出。好的,我没有看到这一部分,作为指导,我会告诉你检查mysqli_fetch_array()期望参数1是mysqli_result,布尔givenYes抱歉,忘了更改它:)它功能完整吗?这是一个很好的工作。。但仍然不是60秒内的所有行都分组在一起。。它为同一个用户返回两个条目,即使所有条目之间的间隔小于60秒(从该用户的第一个时间戳开始)…我对此表示感谢。。这对我来说是可行的,但是如果我想更改它,您知道我如何指定60秒或不同的时间范围吗?