簡體   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