我需要查询此DB以获取每一行,还要查询结果的一个列值的SUM.我可以使用php来获取总值,但是我需要运行两个循环,一个用于获取总数(在结果之上的顶部).所以我更喜欢查询来捕获它并只是创建一个"总"行,但我唯一能让它工作的方法是使用一个子查询,它实质上是原始查询的重复.有没有更好的办法?
SELECT CONCAT(u.firstname, ' ', u.lastname ) name, u.id, s.description, s.shiftstart, s.shiftend, (SELECT SUM( TIME_TO_SEC( TIMEDIFF( shiftend, shiftstart ) ) ) /3600 FROM shifts WHERE id = '$user' AND DATE( shiftstart ) BETWEEN '$start' AND '$end') total FROM shifts s INNER JOIN users u ON ( s.id = u.id ) WHERE s.id = '$user' AND DATE( shiftstart ) BETWEEN '$start' AND '$end' ORDER BY shiftstart
以上工程和产出:
name id description shiftstart shiftend total Joe User joeuser Stuff 2009-01-05 07:45:00 2009-01-05 12:15:00 39.5000 Joe User joeuser Stuff 2009-01-05 13:00:00 2009-01-05 17:00:00 39.5000 Joe User joeuser Stuff 2009-01-06 07:45:00 2009-01-06 10:45:00 39.5000 Joe User joeuser Stuff 2009-01-06 10:45:00 2009-01-06 12:45:00 39.5000 Joe User joeuser Stuff 2009-01-06 13:30:00 2009-01-06 14:30:00 39.5000 Joe User joeuser Stuff 2009-01-06 14:30:00 2009-01-06 17:00:00 39.5000 Joe User joeuser Stuff 2009-01-07 09:45:00 2009-01-07 14:00:00 39.5000 Joe User joeuser Stuff 2009-01-07 15:00:00 2009-01-07 17:00:00 39.5000 Joe User joeuser Stuff 2009-01-08 08:00:00 2009-01-08 12:15:00 39.5000 Joe User joeuser Stuff 2009-01-08 13:15:00 2009-01-08 17:00:00 39.5000 Joe User joeuser Stuff 2009-01-09 07:45:00 2009-01-09 10:45:00 39.5000 Joe User joeuser Stuff 2009-01-09 11:45:00 2009-01-09 15:15:00 39.5000 Joe User joeuser Stuff 2009-01-09 15:15:00 2009-01-09 17:00:00 39.5000
这是我需要的,但可能不是最好的方法.
MySQL支持一个名为ROLLUP的特殊分组修饰符.
SELECT CONCAT(u.firstname, ' ', u.lastname ) name, u.id, s.description, s.shiftstart, s.shiftend, SUM( TIME_TO_SEC( TIMEDIFF( shiftend, shiftstart ) ) ) /3600 total FROM shifts s INNER JOIN users u ON ( s.id = u.id ) WHERE s.id = ? AND DATE( shiftstart ) BETWEEN ? AND ? GROUP BY u.id, s.shiftstart WITH ROLLUP ORDER BY shiftstart;