gpt4 book ai didi

php - 查询2个表并将数据合并到一个数组中

转载 作者:行者123 更新时间:2023-11-29 07:58:04 25 4
gpt4 key购买 nike

我正在尝试将2个查询的结果合并到一个数组中,但是在获取正确的代码时遇到了问题。

我有一个名为PrimaryEvents的表,可以查询将其添加到数组中。该查询可以正常工作:

    $rows = query("SELECT * FROM PrimaryEvents WHERE unit = ? ORDER BY event", $unit);


我使用以下方法将数据添加到数组中:

    foreach ($rows as $row)
{
// $event = lookup($row["event"]); (removed as spotted by sergio not required)
$event["event"] = $row["event"];
$event["validity"] = $row["validity"];
$event["eventsrequired"] = $row["eventsrequired"];
$event["unit"] = $row["unit"];
$event["role"] = $row["role"];

//now we have the data lets try and do something to it
if ($event["role"] == "0")
{
//then the user is active so change value to a YES
$event["role"] = "ALL";
}

//add our stock to the portfolio array
$portfolio[] = $event;
}


到目前为止,一切正常。我想查询一个单独的表,并将某些结果添加到数组组合[];

    $rowsCompleted = query("SELECT * FROM portfolio WHERE id = ? ORDER BY name", $_SESSION["id"]);



我最初的计划是使用以下附加代码将感兴趣的数据添加到Portfolio []中,但是它不起作用:

    //now add individual stats to the array
foreach($rowsCompleted as $row)
{
if ($portfolio["event"] == $row["name"]
{
//then add our number and date to the array
$portfolio["datecompleted"] = $row["datecompleted"];
$portfolio["number"] = $row["number"];
}

//else do nothing
}


我的最终目标是从投资组合表中提取数据完成的值和数字值,然后仅在事件名称与投资组合数组中的名称匹配时才将其添加到数组中。

希望我已经很好地描述了我的问题和要求的行为。

感谢您可以提供的帮助,我是php / sql的新手,所以我正在学习。

安迪

编辑:
还尝试了以下循环尝试遍历数组:

    //now add individual stats to the array
foreach($rowsCompleted as $row)
{
foreach ($portfolio["event"] as $item)
{
if ($portfolio["event"] == $row["name"]
{
//then add our number and date to the array
$portfolio["datecompleted"] = $row["datecompleted"];
$portfolio["number"] = $row["number"];
}
}
//else do nothing
}


EDIT2:试图使我的问题更清楚:Primary-events表列出了特定用户必须完成的所有事件。投资组合表跟踪用户已完成哪些事件(通过日期和数字)。

我想运行一个查询,列出主事件中的所有事件,然后在这些结果中添加完成日期和用户投资组合中的数字。如果投资组合中的答案是空白,则用户尚未完成事件,但我仍想从Primary-events表数据中列出它。

我尝试了2个查询,因为它似乎遵循了我要实现的目标。

编辑3:

在Barmar的帮助下的新代码

    foreach ($rows as $row) {
$event = lookup($row["event"]);
$event["event"] = $row["event"];
$event["validity"] = $row["validity"];
// $event["datecompleted"] = $row["datecompleted"];
// $event["number"] = $row["number"];
$event["eventsrequired"] = $row["eventsrequired"];
$event["unit"] = $row["unit"];
$event["role"] = $row["role"];

//now we have the data lets try and do something to it
if ($event["role"] == "0") {
//then the user is active so change value to a YES
$event["role"] = "ALL";
}

//add our stock to the portfolio array
$portfolio[] = $event;

//now add individual stats to the array
foreach ($rowsCompleted as $row) {
foreach ($portfolio as &$item) {
if ($item["event"] == $row["name"]) {
//then add our number and date to the array
$item["datecompleted"] = $row["datecompleted"];
$item["number"] = $row["number"];
}
}
}

}


该页面仍然没有被chrome显示,因此我猜我错过了一些东西。

EDIT4:页面显示,当在html页面上呈现表时,我现在得到未定义的索引错误。

具体来说,未定义的索引错误是针对完成日期和编号的。我是说这些值没有被添加到投资组合数组中吗?尽力帮助我添加了一条Else语句(如下所示)以确保即使该事件不可用,索引也为:

    //now add individual stats to the array
foreach($rowsCompleted as $row)
{
foreach ($portfolio as &$item)
{
if ($item["event"] == $row["name"])
{
//then add our number and date to the array
$item["datecompleted"] = $row["datecompleted"];
$item["number"] = $row["number"];
}
else
{
$item["datecompleted"] = "Never";
$item["number"] = "0";
}
}
}


编辑5:接近成功。抱歉,无法重新打开它,但我刚刚注意到了意外的行为:嵌套循环仅将完成日期和第一个值的数字设置为投资组合表中的匹配项。未设置以下值。似乎嵌套循环不会逐步浏览所有投资组合的值,而只会在第一个“事件” ==“名称”时退出。

编辑6:样本数据和所需功能的说明:

投资组合样本数据

    |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


id是完成活动的用户的ID
number是完成的事件数

PrimaryEvents样本数据

    |id|event   |validity|eventsrequired
|1 |event1 |7 |10
|1 |event2 |25 |1
|1 |event3 |12 |50


id是创建条目的用户的ID(仅用于历史目的)

所需的功能是:

该查询应创建一个数组,以允许针对主要事件表中的所有内容创建一个html表。下表列出了用户必须完成的事件。

第二个查询或当前嵌套循环应从投资组合表中收集当前用户ID的数据,然后将事件名称与Primary-events数组中的名称匹配,并更新(如果存在)数字和日期完成的值。 (即,填充用户已完成事件的数据)。

当前代码仅在第一个匹配项中合并投资组合中的数据,但随后嵌套循环似乎退出了。

希望这是对我要实现的目标的更清晰的描述。

编辑:我已经更改了使用下面的Left联接语句的功能,但是仍然有问题:

该表仅包含主要事件表中的一些事件,而不是全部。被撤消的事件仅是用户已完成的事件,未显示用户尚未完成的事件。

编辑:此查询似乎工作:

    $allEvents = query("SELECT * FROM PrimaryEvents LEFT JOIN portfolio ON (PrimaryEvents.event = portfolio.name) WHERE PrimaryEvents.event = ? AND (portfolio.id = ? Or portfolio.id is null) ORDER BY PrimaryEvents.event", $currentEvent, $_SESSION["id"]);

最佳答案

您需要注意,投资组合不是关联数组,而是多维数组,因此无法使用$portfolio["event"]访问它。您应该使用$portfolio[0]["event"]$portfolio[1]["event"]等。

很难向您显示确切的解决方案,因为我不知道这些数组/数据库查询应如何合并。

编辑

看来您的查询应如下所示:

query("SELECT * FROM PrimaryEvents e LEFT JOIN portfolio p ON e.event = p.name WHERE e.unit = ? AND p.id = ? ORDER BY e.event", $unit,$_SESSION["id"]);


编辑2

由于性能下降,我没有提出嵌套循环(因为它现在处于修改的问题中)。

关于php - 查询2个表并将数据合并到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com