繁体   English   中英

PHP的MySQL foreach循环

[英]php foreach loop with mysql

我正在尝试从数据库中检索数据。 我需要三个数据:kaupunki_id,Opisto和pisteet_1。 问题在于它们都在不同的表中。 我的代码确实检索了正确的数据,但是它不是超级自动的。 目前,变量$ t决定要选择的数据。

我的表结构:

表名: pisteet

在此处输入图片说明

表名: oppilaitokset

在此处输入图片说明

表名: kaupungit

在此处输入图片说明

我需要什么:对于每个opisto(行),我需要获取匹配的pisteet_1(行)并计算点的平均值。 然后使用匹配的kaupunki_id(row)类在<td>回显它。

oppilaitokset表中 ,可以有多行具有相同的kaupinki_id(row) ID。

我的代码正在运行,但仅显示一个结果,但不是那么自动:

$keskiynnays = 0;
$kerto=0;
foreach ($db->query("SELECT kaupunki_id FROM pisteet") as $kaupunki_id) {
    foreach ($kaupunki_id as $kaikkinimet => $t) {
        $t= 1;
        foreach ($db->query("SELECT opisto FROM oppilaitokset WHERE kaupunki_id = '$t'") as $kaupungit) {
            foreach ($kaupungit as $kaupunki => $k) {
            }
        }
        foreach ($db->query("SELECT pisteet_1 FROM pisteet WHERE opisto_id = '$t'") as $keskiarvo1) {
            foreach ($keskiarvo1 as $loopkeskiarvo1 => $kes1) {
            }
            $kerto++;
            $keskiynnays +=$kes1;
            $keskiarvolaskettu1 = $keskiynnays / $kerto;
        }
    }       
}
echo "<td class=\"" . $t . "\">" . $k  . ": " . $keskiarvolaskettu1 . "</td>";

您正在设置变量$t = 1 ,这就是为什么总是得到同一行的原因。

一般来说,您的代码很糟糕,并且您正在运行大量查询。 尝试搜索有关SQL JOINS的信息,以了解如何更快地实现相同的结果。

如前所述,我将尝试进行SQL连接-像这样:

$query = "SELECT opisto As O, AVG(pisteet_1) As P, ka.kaupunki_id As K FROM ".
"oppilaitokset op ".
"LEFT JOIN pisteet pi ".
"ON op.id = pi.opisto_id ".
"LEFT JOIN kaupungit ka ".
"ON op.kaupunki_id = ka.kaupunki_id ".
"GROUP BY opisto, ka.kaupunki_id";

foreach ($db->query($query) as $row) {
    print $row['O'] . "<br>";
    print $row['P'] . "<br>";
    print $row['K'] . "<br>";
}

因此,通过使用外键,您获得了与其他表相关的pisteet表。 好的。 很高兴您上传了这些图片。

如果数据库不相关,则应该像以前那样工作。 出于多种原因,这将是一件可怕的事情。 但这就是为什么要发明SQL的原因。 必须充分利用关系数据库系统。 无论如何,你都会使生活变得艰难。

你说:

“ @Carpetsmoker是的,我知道我为此感到抱歉,因为我已经很多了,不能再真正改变它们了。:/ –”

是的,您可以使用PHP来“完成任务”,并且无需加入联接即可进行查询,但是您必须考虑一下。 为什么@Carpetsmoker告诉你了?

“我已经有那么多了,不能再真正改变它们了”,使我感到您不了解自己的投入,但最重要的是,您坚持要坚持自己的投入。

假设您已在此代码段上解决了该问题。 接下来的事情是在项目的任何地方都错误地复制代码。 你会怎么做? 复制-粘贴并编辑以适合您的需求?

花费一些时间,学习JOIN命令及其作用,然后使用Joins逐步重新进行查询,这是100%的最佳实践。 PHP至少会完成原定的工作,而MySQL将进行查询。

至于“太多”部分,我相信您已经知道模块化结构化编程的概念。

如果您不这样做或忘记了,请举一个例子。 假设您想在代码的10个地方执行某些操作。 你是做什么?

1]编写代码,然后复制粘贴,然后根据需要进行略微编辑。

2]创建一个包含代码的函数,然后在这十个部分上调用该函数。 可以通过传递一些参数来实现编辑。

方法1] 错误

方法2]是一种更好的方法。 也许不是最好的,但是可以肯定是更好的。 你能想象为什么吗?

在第二种方法中,如果您犯了一个错误,则可以更改一次功能,并且自动为所有十个位置更改该功能。 在第一种方法中,复制粘贴是您的宿敌。 您已经受够了。 您自己的话是这样说的:“您无法再更改它们”。 相信我,在编程的第一步中,我犯的错误比你还糟。 那时我还很幸运能够上网。 :(

因此,不好的做法从一开始就很容易做到(因为您不必学习一些概念),但是从长远来看,这并不容易。 不幸的是,您在这里学到了很难的方法。

查看以下链接以快速了解: 单击此处此处

(一些最初的Google搜索结果)

您可以稍后再感谢我们。

至于功能,从这里开始

结合这些概念,您将使自己的生活更轻松。

最后,我假设您不了解这些概念。 我无意冒犯您或让您感到难过。 我看到的只是一段代码。

干杯。

编辑:错别字。

这将检索所有值并正确打印它们。 修改@Kez的代码(请参见上文)

echo "<table class=\"zebra1\">";
    echo "<tr>";
    $query = "SELECT opisto As O, AVG(pisteet_1) As P, ka.kaupunki_id As K FROM ".
    "oppilaitokset op ".
    "LEFT JOIN pisteet pi ".
    "ON op.opisto_id = pi.opisto_id ".
    "LEFT JOIN kaupungit ka ".
    "ON op.kaupunki_id = ka.kaupunki_id ".
    "GROUP BY opisto, ka.kaupunki_id";

    foreach ($db->query($query) as $row) {
        echo "<td class=\"" . $row['K'] . "\">" . $row['O'] . ": ";
        echo $row['P'] . "</td>";
    }
    echo "</tr>";
    echo '</table>';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM