将两个循环转换为智能


Converting two loops to smarty

我在PHP中有两个周期,我需要转换为智能结构。向下包含 PHP 代码。

法典:

<pre>
$query = mysqli_query($cnn, "SELECT *, COUNT(*) AS ph FROM course INNER JOIN completed_course ON course.id = completed_course.id_course  GROUP BY course.id");
while ($row = mysqli_fetch_array($query)){ 
    <tr> <td> <?php echo  $row['id']; ?></td><td> <?php echo  $row['nazev']; ?  </td><td>
    ?php echo  $row['ph']; ?  </td> <td>
    ?php
    $Number_of_graduates = mysqli_query($cnn, "SELECT COUNT(*) AS abs FROM  participant where id_completed_course = $row[id]");
    while ($rAbs = mysqli_fetch_array($Number_of_graduates)){
    echo $rAbs['abs'];
} ?
</td>
</pre>

问题是。如何转换来自SQL的第一个id的第二个循环?

好的

,所以你的问题实际上是关于SQL的。让我们看看您的查询。第一个看起来像这样:

SELECT *, COUNT(*) AS ph
FROM course
    INNER JOIN completed_course ON course.id = completed_course.id_kurz
GROUP BY course.id

我假设(因为我对您的数据库方案一无所知)这将给出课程列表和完成它们的学生人数(也许 - 我不知道completed_course表中有什么)。如前所述,此查询还将为您提供来自completed_course表的一些数据,但它可能毫无意义,因为您仅在course.id上进行分组。

第二个查询是:

SELECT COUNT(*) AS abs
FROM participant
WHERE id_completed_course = {DATA FROM FIRST QUERY}

据推测,此查询旨在为您提供已完成课程的参与者总数。为了做到这一点,WHERE子句可能如下所示:

SELECT COUNT(*) AS abs
FROM participant
WHERE id_completed_course IN (
    SELECT course.id FROM
    FROM course
        INNER JOIN completed_course ON course.id = completed_course.id_kurz
)

请注意,我正在获取在第一个查询中选择的值,并使它们成为IN子句的一部分。此查询可以大大简化 - 例如,子查询中的 JOIN 实际上只是从completed_course表中选定的 ID 值:

SELECT COUNT(*) AS abs
FROM participant
WHERE id_completed_course IN (
    SELECT id_kurz
    FROM completed_course
)

如果您完全摆脱子查询并仅将参与者加入completed_course表,则查询实际上会更有效率。

SELECT COUNT(*) AS abs
FROM participant
    INNER JOIN completed_course ON participant.id_completed_course=completed_course.id_kurz

最后一个查询将为您提供一个值:其id_completed_course值对应于completed_course表中的项目的参与者数。您可以使用 mysqli 方法来检索此数据并将其传递给您的 Smarty 模板。