我正在尝试从2个表中保存的数据生成表列表。一个表称为PrimaryEvents,一些示例数据如下所示:
|id|event |validity|eventsrequired
|1 |event1 |7 |10
|1 |event2 |25 |1
|1 |event3 |12 |50
id这里只是创建数据的用户ID。
第二个表称为投资组合,一些样本数据如下:
|id|name |number|datacompleted
|21|event1 |3 |2014-07-07
|15|event1 |5 |2014-07-05
|21|event2 |5 |2014-05-08
|15|event1 |1 |2013-05-05
|15|event1 |1 |2014-05-05
|21|event1 |13 |2014-08-07
|21|event1 |6 |2014-07-08
id here是已完成活动的用户的ID。
我有一个填充数组的查询以允许向用户显示一个表,该表显示了来自PrimaryEvents的所有事件的列表,如果他们已经通过相同的事件完成了一个事件名称。
我想略微更改功能以允许以下内容: 仅合并有效期日期范围内的事件,并且合并的数据会自动对该数字进行求和(来自portfolio.number)。
我不确定如何真正进步。目前,我已设法使用以下代码提取数据范围:
$currentDate = DATE("Y-m-d");
$eventList = query("SELECT event,validity FROM PrimaryEvents ORDER BY event");
foreach ($eventList as $row)
{
//
$event["validity"] = $row["validity"];
$validityDate = Date("Y-m-d", strtotime("-". $row["validity"] . "days"));
$eventsDateValidCompleted = query("SELECT * FROM portfolio WHERE id = ? AND datecompleted BETWEEN ? AND ? ORDER BY name", $_SESSION["id"], $validityDate , $currentDate);
}
我缺少的是如何使用daterange排序的数组数据做一些有用的事情。
问题: 1)如何在有效日期范围内对事件数据进行求和($ eventsDateValidCompleted数组中返回的IE)?
2)如何将此数组数据LEFT JOIN到我当前查询的每一行?
$allEvents = query("SELECT * FROM PrimaryEvents LEFT JOIN portfolio ON (PrimaryEvents.event = portfolio.name) WHERE PrimaryEvents.role = ? AND (portfolio.id = ? Or portfolio.id is null) ORDER BY PrimaryEvents.event", $currentRole, $_SESSION["id"]);
3)有没有更好的方法来实现这一目标?
感谢您提供的任何帮助。
答案 0 :(得分:2)
您可以使用SUM()函数和GROUP BY子句对MySQL中的查询中的值求和。例如,如果您想知道给定用户ID和日期范围的所有相关portfolio.number值的总和,您可以更改此行:
$eventsDateValidCompleted = query("SELECT * FROM portfolio WHERE id = ? AND datecompleted BETWEEN ? AND ? ORDER BY name", $_SESSION["id"], $validityDate , $currentDate);
到此:
$eventsDateValidCompleted = query("SELECT SUM(number) AS total_number FROM portfolio WHERE id = ? AND datecompleted BETWEEN ? AND ? GROUP BY id", $_SESSION["id"], $validityDate , $currentDate);
如果您想按事件获取此总和值,并且作为原始查询的一部分,您可以执行以下操作:
SELECT e.event,e.validity, SUM(p.number) AS total_number
FROM PrimaryEvents e
LEFT JOIN portfolio p ON p.name = e.event
GROUP BY e.id
ORDER BY e.event
答案 1 :(得分:1)
我不确定我到底想要什么,但我建议在这些行中使用SQL SUM()
和GROUP BY
:
SELECT pe.id, pe.event, sum(p.number) FROM PrimaryEvents pe
LEFT JOIN portfolio p ON (pe.event = p.name) AND p.id = pe.role AND p.datecompleted BETWEEN ? AND ?
WHERE pe.role = ?
GROUP BY pe.id, pe.event
但是,正如我所说,你的(减少的)数据模型和查询不是很一致,这就是为什么我不知道上面是否会为你做任何事情。