将mysql查询结果加入数组

时间:2014-07-08 15:15:48

标签: php mysql arrays

我正在尝试从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)有没有更好的方法来实现这一目标?

感谢您提供的任何帮助。

2 个答案:

答案 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

但是,正如我所说,你的(减少的)数据模型和查询不是很一致,这就是为什么我不知道上面是否会为你做任何事情。