PHP/MySQL-组合选择查询

PHP/MySQL-组合选择查询,php,mysql,Php,Mysql,我有3个MySQL查询,如下所示 $q1 = "SELECT id,date,quantity1,quantity2,total FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' ORDER BY id"; $r1 = mysql_query($q1); $q2 = "SELECT SUM(total) AS stotal FROM test WHERE type='pencil' AND

我有3个MySQL查询,如下所示

$q1 = "SELECT id,date,quantity1,quantity2,total FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' ORDER BY id";
$r1 = mysql_query($q1);

$q2 = "SELECT SUM(total) AS stotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id";
$r2 = mysql_query($q2);

$q2 = "SELECT AVG(ROUND(total)) AS atotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id";
$r2 = mysql_query($q2);
$lastr = '';
while ((list($id, $date, $q1, $q2, $total) = mysql_fetch_row($r1)) && ($row =  mysql_fetch_array($r2)) && ($row =  mysql_fetch_array($r3)))  {
if ($lastr != $id ) {
    if ($lastr != '') {
        // output row
    echo "<tr><th>$lastr</th><th>$stotal</th><th>$atotal</th><td>";
        echo join('</td><td>', $rowdata) . "</td></tr>\n";
    }
    $rowdata = $empty;
    $lastr = $id;
}
$rowdata[$rdate]  = $q1 .= '</td><td>' . $q2 .= '</td><td>' . $total;
}
如何组合这3个查询?所以我可以在一个while循环中使用它。我在while循环中尝试了multiple语句,如下所示

$q1 = "SELECT id,date,quantity1,quantity2,total FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' ORDER BY id";
$r1 = mysql_query($q1);

$q2 = "SELECT SUM(total) AS stotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id";
$r2 = mysql_query($q2);

$q2 = "SELECT AVG(ROUND(total)) AS atotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id";
$r2 = mysql_query($q2);
$lastr = '';
while ((list($id, $date, $q1, $q2, $total) = mysql_fetch_row($r1)) && ($row =  mysql_fetch_array($r2)) && ($row =  mysql_fetch_array($r3)))  {
if ($lastr != $id ) {
    if ($lastr != '') {
        // output row
    echo "<tr><th>$lastr</th><th>$stotal</th><th>$atotal</th><td>";
        echo join('</td><td>', $rowdata) . "</td></tr>\n";
    }
    $rowdata = $empty;
    $lastr = $id;
}
$rowdata[$rdate]  = $q1 .= '</td><td>' . $q2 .= '</td><td>' . $total;
}

你可以这样组合

SELECT id,date,quantity1,quantity2,total,(SELECT SUM(total)  FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id) as sum_total,(SELECT AVG(ROUND(total))  FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY id ORDER BY id") as avg_total FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' ORDER BY id";

您可以像这样将查询添加到一起

$q1 = "SELECT id,date,quantity1,quantity2,total,AVG(ROUND(total)) AS stotal, AVG(ROUND(total)) AS atotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' GROUP BY  id,date,quantity1,quantity2,total,stotal,atotal ORDER BY id";
$r1 = mysql_query($q1);
需要group by子句的原因是,不能在group by语句之外进行非加积选择,因为select中存在加积函数


希望这能有所帮助。

您可以使用此单一的派生查询

$q1 = "SELECT id,date,quantity1,quantity2,total,SUM(total) AS stotal,AVG(ROUND(total)) AS atotal FROM test WHERE type='pencil' AND MONTH(date)='$month' AND YEAR(date)='$year' ORDER BY id";
$r1 = mysql_query($q1);
SELECT
  t.id,
  t.date,
  t.quantity1,
  t.quantity2,
  t.total,
  lt.stotal,
  lt.atotal
FROM test as t
  left join (select
           id,
           SUM(total)   AS stotal,
           AVG(ROUND(total)) AS atotal
         from test
         WHERE type = 'pencil'
         AND MONTH(date) = '$month'
         AND YEAR(date) = '$year'
         GROUP BY id) as lt
    on lt.id = t.id
WHERE type = 'pencil'
    AND MONTH(date) = '$month'
    AND YEAR(date) = '$year'
ORDER BY id
或者这更简单

SELECT
  t.id,
  t.date,
  t.quantity1,
  t.quantity2,
  t.total,
  SUM(lt.stotal) AS stotal,
  AVG(ROUND(lt.atotal)) AS atotal
FROM test as t
  left join test as lt
    on lt.id = t.id
WHERE type = 'pencil'
    AND MONTH(date) = '$month'
    AND YEAR(date) = '$year'
ORDER BY id

你知道如何进行子查询吗?如果你要使用
mysql\u query
,除非你有非常好的理由,否则你真的不应该使用它,你需要在查询中输入任何和所有的值。@raheel,答案已被接受。我想投票支持它,但我不想让它支持我,我需要更多的代表来支持它(,无论如何,我不会离开这个话题,直到我投票支持你的答案。再次非常感谢你。^ ^ ^ ^。好吧,我建议这很简单,第一个是派生查询,你可以用第二个做,这很快,这返回错误#1242-子查询返回超过1行。嗨,这只返回一行。嗨,第一个解决方案很有魅力,准确地说我需要的。第二个解决方案抛出一个错误“#1052-字段列表中的“总计”列不明确”。我正在使用解决方案一。非常感谢-nublet P.S:我正在等待我的代表增加以接受您的答案。应该是t.total抱歉