需要只显示每个ID的最新记录,并使用php& amp;显示每个类别的总和。 MySQL的

时间:2012-05-01 03:17:19

标签: php mysql

我已经尝试过一切来解决这个问题,但我无法得到正确的总数。我尝试添加所有记录而不仅仅是最新记录,或者我只获得第一条记录。

我的第一张表:集线器

hubID    hubName
1           hub1
2           hub2

我的第二张表:hub_reports

reportID    hubID          date          health         school 
1               1          2012-04-27    467            322 
2               2          2012-04-23    267            22 
3               1          2012-01-20    176            623 

所以你看到的是2个表,一个包含组织名称和其他信息,第二个表包含每个组织每季度提交的报告。我想列出所有组织及其最新报告。在表格的底部,我想添加目前可用的所有可用的健康工具包和学校工具包。

以下是我正在使用的代码,用于显示所有组织及其最新报告。

SELECT * FROM (SELECT hubName, date, health, school FROM hub_reports,
hubs WHERE hub_reports.hubID = hubs.hubID ORDER BY date DESC) AS Total
GROUP BY hubName

这似乎有效,但当我尝试相同的策略来获得健康和学校专栏的总和时,我得不到正确答案。

SELECT SUM(health) FROM (SELECT hubName, date, health FROM
hub_reports, hubs WHERE hub_reports.hubID = hubs.hubID ORDER BY date
DESC) AS Total GROUP BY hubName

我尝试了另一种使用LEFT JOIN方法,我在另一个论坛上发现但是它似乎没有更好的工作。但我或许我做得不对。

请帮忙!

2 个答案:

答案 0 :(得分:0)

我刚在我的一个项目中遇到过类似的问题。这个查询的变体对我有用。希望它对你有所帮助。

SELECT hubs.hubName, hub_reports.*, 
SUM(hub_reports.health) AS ttl_health, 
SUM(hub_reports.school) AS ttl_school
FROM hubs, hub_reports 
WHERE hub_reports.hubID = hubs.hubID 
GROUP BY hub_reports.hubID
ORDER BY hub_reports.date DESC

这是PHP:

$rs = mysql_query( 'SELECT hubs.hubName, hub_reports.*, 
    SUM(hub_reports.health) AS ttl_health, 
    SUM(hub_reports.school) AS ttl_school
    FROM hubs, hub_reports 
    WHERE hub_reports.hubID = hubs.hubID 
    GROUP BY hub_reports.hubID
    ORDER BY hub_reports.date DESC' );

$grand_total['school']=0;
$grand_total['health']=0;

while ( $row = mysql_fetch_assoc( $rs ) ){ // Step through each hub
    echo "{$row['hubName']} shows {$row['ttl_school']} total school, {$row['ttl_health']} total health";
    $grand_total['school'] += $row['ttl_school'];
    $grand_total['health'] += $row['ttl_health'];
}

echo "Grand Total School: {$grand_total['school']}, Grand Total Health: {$grand_total['health']}";

答案 1 :(得分:0)

您可能正在寻找MAX()功能。

试试这个:

SELECT h.hubID, h.hubname, MAX(hr.date) as hrdate, SUM(hr.health) as health, SUM(hr.school) as school
FROM hubs h
LEFT JOIN hub_reports hr ON hr.hubID = h.hubID
GROUP BY h.hubID

修改

您想要MAX日期,因此它只返回最近的条目(假设您的条目按日期输入)。