Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
Php 关于SELECT语句和查询的建议_Php_Mysql - Fatal编程技术网

Php 关于SELECT语句和查询的建议

Php 关于SELECT语句和查询的建议,php,mysql,Php,Mysql,我需要一个masive select语句或多个查询。我需要在白天将数据分解为特定的时间段。这一次在第一次间歇时效果很好,但之后我就被难倒了。如果我有多个查询,我的mysql_fetch_数组就会遇到问题,比如使用类似于“else”的语法并进行检查 SELECT U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date, SUM(TC.completed) AS ttasks1,

我需要一个masive select语句或多个查询。我需要在白天将数据分解为特定的时间段。这一次在第一次间歇时效果很好,但之后我就被难倒了。如果我有多个查询,我的mysql_fetch_数组就会遇到问题,比如使用类似于“else”的语法并进行检查

SELECT U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date,
    SUM(TC.completed) AS ttasks1,
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      AND TIME(submit_date) BETWEEN '06:00:00' and '07:59:59'       
      GROUP BY U.user_name
    LIMIT 0 , 30
我的fetch数组需要更多,但是如何组合它们呢

<?php
while($rows=mysql_fetch_array($result1)){

?>

这是关于如何组合提取数组的问题。 为什么不使用一个数组来存储来自fetch数组的所有值,如下所示

<?php
$customArray = array();
while($rows=mysql_fetch_array($result1)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//another fetch array

while($rows=mysql_fetch_array($result2)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//now $customArray will have all the required values you need. 
//This is not a great option as it is making the logic expensive. 
//Are you going to use this in a cron job ?
?>

这是关于如何组合提取数组的问题。 为什么不使用一个数组来存储来自fetch数组的所有值,如下所示

<?php
$customArray = array();
while($rows=mysql_fetch_array($result1)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//another fetch array

while($rows=mysql_fetch_array($result2)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//now $customArray will have all the required values you need. 
//This is not a great option as it is making the logic expensive. 
//Are you going to use this in a cron job ?
?>

好的,考虑到您希望每隔2小时定期收集数据,您可以尝试以下方法:

SELECT FLOOR(hour(S.submit_date)/2)*2, U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1,
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30
其中FLOORhourS.submit_date/2*2将每小时映射到每2小时的第一个偶数小时,您可以根据此值进行分组。即

0, 1 -> 0
2, 3 -> 2
4, 5 -> 4
etc...
php更新包括: 一些注意事项:

我用过mysqli 我用一个小时派生表加入了原始查询,以确保没有 假设时间间隔为6:00-20:00的“间隔” 我是按用户排序的,所以我们在循环结果时可以打印给定用户的表格单元格,然后在用户更改时打印新的表格行。 代码如下:

echo '<table border=1><tr><td></td>';
for ($i=6; $i<=18; $i=$i+2) {
    echo '<td colspan=2>'.$i.' - '.($i+2).'</td>';
}

$mysqli = new mysqli('MY_HOST', 'MY_USER', 'MY_PASSWORD', 'MY_DATABASE');

$sql = "
SELECT user_name, IFNULL(equiv1,0) AS equiv1, IFNULL(ttasks1,0) AS ttasks1, hour
FROM
(
    SELECT 6 AS hour
    UNION SELECT 8
    UNION SELECT 10
    UNION SELECT 12
    UNION SELECT 14
    UNION SELECT 16
    UNION SELECT 18
) hours LEFT JOIN

(
SELECT FLOOR(hour(S.submit_date)/2)*2 as task_hour, U.user_name, ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30
) task_summary
ON hours.hour = task_summary.task_hour
ORDER BY user_name, hour
";

$result = $mysqli->query($sql);

$user_name = '';
while ($row = $result->fetch_assoc()) {
    if ($user_name <> $row['user_name']){
        echo '</tr><tr><td>'.$row['user_name'].'</td>'; //start a new row if user changes
        $user_name = $row['user_name']; //update user variable for checking on next iteration
    }
    echo '<td>'.$row['equiv1'].'</td>';
    echo '<td>'.$row['ttasks1'].'</td>';
}

echo '</tr><table>';

好的,考虑到您希望每隔2小时定期收集数据,您可以尝试以下方法:

SELECT FLOOR(hour(S.submit_date)/2)*2, U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1,
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30
其中FLOORhourS.submit_date/2*2将每小时映射到每2小时的第一个偶数小时,您可以根据此值进行分组。即

0, 1 -> 0
2, 3 -> 2
4, 5 -> 4
etc...
php更新包括: 一些注意事项:

我用过mysqli 我用一个小时派生表加入了原始查询,以确保没有 假设时间间隔为6:00-20:00的“间隔” 我是按用户排序的,所以我们在循环结果时可以打印给定用户的表格单元格,然后在用户更改时打印新的表格行。 代码如下:

echo '<table border=1><tr><td></td>';
for ($i=6; $i<=18; $i=$i+2) {
    echo '<td colspan=2>'.$i.' - '.($i+2).'</td>';
}

$mysqli = new mysqli('MY_HOST', 'MY_USER', 'MY_PASSWORD', 'MY_DATABASE');

$sql = "
SELECT user_name, IFNULL(equiv1,0) AS equiv1, IFNULL(ttasks1,0) AS ttasks1, hour
FROM
(
    SELECT 6 AS hour
    UNION SELECT 8
    UNION SELECT 10
    UNION SELECT 12
    UNION SELECT 14
    UNION SELECT 16
    UNION SELECT 18
) hours LEFT JOIN

(
SELECT FLOOR(hour(S.submit_date)/2)*2 as task_hour, U.user_name, ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30
) task_summary
ON hours.hour = task_summary.task_hour
ORDER BY user_name, hour
";

$result = $mysqli->query($sql);

$user_name = '';
while ($row = $result->fetch_assoc()) {
    if ($user_name <> $row['user_name']){
        echo '</tr><tr><td>'.$row['user_name'].'</td>'; //start a new row if user changes
        $user_name = $row['user_name']; //update user variable for checking on next iteration
    }
    echo '<td>'.$row['equiv1'].'</td>';
    echo '<td>'.$row['ttasks1'].'</td>';
}

echo '</tr><table>';


只要有可能,尝试使用X?和而不是X>?和X<?。这通常在执行方面更快,因为优化器更快乐。不鼓励使用mysql_fetch_数组。尝试改用mysqli,这也可能有助于solution@caitriona:更改数据库库对OP有何帮助?红色汽车比蓝色汽车更容易从商店买到食品?他说“我的mysql_fetch_数组在语法上有问题”?很好的建议-让我试试,我会发布结果。非常感谢。只要有可能,尝试使用X?和而不是X>?和X<?。这通常在执行方面更快,因为优化器更快乐。不鼓励使用mysql_fetch_数组。尝试改用mysqli,这也可能有助于solution@caitriona:更改数据库库对OP有何帮助?红色汽车比蓝色汽车更容易从商店买到食品?他说“我的mysql_fetch_数组在语法上有问题”?很好的建议-让我试试,我会发布结果。非常感谢。啊,好吧,我知道你做了什么。我很抱歉,我应该说明的。我想随着时间的推移捕捉并发布2小时的间隔。因此,基本上,当我转到页面时,我希望看到所有间隔期间的所有数据。上午6-8点航向、上午8-10点航向等。。。下面是每行$interval数据。您必须“推断”小时上限,只需添加2和在php中最容易做到的am/pm,但这仍然会生成该数据。在没有数据的情况下会出现间隙,或者是因为没有数据,或者是因为时间尚未发生,但如果这是问题所在,那么很容易解决。如此接近!:好的,我很抱歉,但我正在学习,我不确定你们所指的是推断和添加2以及am/pm。如果可能的话,我宁愿把它放在24小时之内。另外,我如何获得每个时间段的增量值——我在这件事上苦苦挣扎。也就是说,别名被称为equiv1和ttasks1,因此在每次递增的时间段中,如何在html表中获得要更改/更新的值?非常感谢。好吧,我没有正确理解你的问题。我想我现在明白你想要什么了。我来编辑答案。哇!好的,这比我预期的要多得多。我非常感激!它可以工作,只是在下一个间隔期间不会将数据转移到下一列。它们都堆在第一列。啊,好的,我知道你做了什么。我很抱歉,我应该说明的。我想随着时间的推移捕捉并发布2小时的间隔。因此,基本上,当我转到页面时,我希望看到所有间隔期间的所有数据。上午6-8点航向、上午8-10点航向等。。。下面是每行$interval数据。您必须“推断”小时上限,只需添加2和在php中最容易做到的am/pm,但这仍然会生成该数据。在没有数据的地方也会有空白,因为
没有,或者时间还没有到,但如果这是问题所在,很容易解决。太近了!:好的,我很抱歉,但我正在学习,我不确定你们所指的是推断和添加2以及am/pm。如果可能的话,我宁愿把它放在24小时之内。另外,我如何获得每个时间段的增量值——我在这件事上苦苦挣扎。也就是说,别名被称为equiv1和ttasks1,因此在每次递增的时间段中,如何在html表中获得要更改/更新的值?非常感谢。好吧,我没有正确理解你的问题。我想我现在明白你想要什么了。我来编辑答案。哇!好的,这比我预期的要多得多。我非常感激!它可以工作,只是在下一个间隔期间不会将数据转移到下一列。它将它们全部堆叠在第一列中。