php 是否处理sql查询中的双循环?

j2cgzkjk  于 2022-11-21  发布在  PHP
关注(0)|答案(1)|浏览(159)

我现在正在学习php/mysql,我有一个项目。
我有3个主要的SQL表:

  • 动画包含姓名、日期、地址等
  • animateurs(“工人”)是一个有许多数据的人的列表
  • crosstable是另外两个表之间的多对多关系。每行包含一个“animationId”、一个“animateurId”和一个状态(他/她是否感兴趣、空闲或不感兴趣?)。

many-to-many SQL table
我正在尝试制作一个网页表格来显示所有的动画,其中一栏包含动画师。我想根据他们的状态来对他们进行排序。这是我目前所做的:
my results table atm
(我仍然很自豪,一个月前开始学习php和SQL,而不是一个程序员......但无论如何)。
起初,我尝试用$rowDispos运行多个while循环,但似乎没有重置。我想我可能会运行一个循环,并为每个动画的每个人的状态创建不同的数组,但我不确定如何做到这一点。
我的目标是在“Disponibles:“下面有另一个人员列表,标记为“如果必要:“。
在某些时候,我需要收集参与一个事件的所有人的数据(例如,向他们发送电子邮件)。
最重要的是,我不知道什么是实现我正在努力做的事情的最好方法。
谢谢你,谢谢你
第一个

重新解释事情:
我需要一个每个动画一行的表格(每个事件)。每一列都包含有关该事件的数据(日期、时间、地点...)。其中一列包含有关该事件的人员的数据。他们可以是出席、感兴趣或忙碌。我希望在该列中按出席、感兴趣和忙碌对人员进行排序和列出。这些数据存储在交叉表中,其中包含事件的ID、人员、以及他们关于该事件的“状态”(以及可能以后的其他事情)。
我需要(一次一步,但这可能很重要)向所有标记为“出席”活动的人发送电子邮件。

f45qwnt8

f45qwnt81#

现在,让我们继续在while ()循环中进行查询。您希望动画按其状态存储。您当前有:

SELECT * 
FROM animateurs 
JOIN crosstable ON animateurs.idAnimateur = crosstable.idAnimateur 
WHERE idAnimation = :idAnimation

当前您只使用了3列。在这种情况下,最好为这些列命名:

SELECT 
  animateurs.disponibilite, 
  animateurs.prenom,
  animateurs.nom
FROM animateurs 
JOIN crosstable ON animateurs.idAnimateur = crosstable.idAnimateur 
WHERE crosstable.idAnimation = :idAnimation;

请注意,我每次都清楚地表明了列位于哪个表中。现在可能不需要它,但当查询变得更复杂时,它将防止错误。
现在,您可以使用三个查询来获取三个状态组:

SELECT 
  animateurs.disponibilite, 
  animateurs.prenom,
  animateurs.nom
FROM animateurs 
JOIN crosstable ON animateurs.idAnimateur = crosstable.idAnimateur 
WHERE crosstable.idAnimation = :idAnimation AND
      crosstable.disponibility = 'disponible';

对于'non''sieBesoin'的人也是如此。但是,我们希望在一个查询中完成这一操作。我会保持简单,使用以下语句:

SELECT 
  animateurs.disponibilite, 
  animateurs.prenom,
  animateurs.nom,
  crosstable.disponibility
FROM animateurs 
JOIN crosstable ON animateurs.idAnimateur = crosstable.idAnimateur 
WHERE crosstable.idAnimation = :idAnimation;

现在可以用PHP对它们进行排序:

$animateurGroups = [];
while ($rowDispos = $req->fetch()) {
    $disponibility = $rowDispos['disponibilite'];
    $animateurGroups[$disponibility][] = $rowDispos['prenom']. " " .$rowDispos['nom'];
}

然后,您可以如下所示显示这三个组:

foreach (animateurGroups as $disponibility => $animateurGroup) {
    echo "Disponibles: $disponibility<br/>";
    foreach ($animateurGroup as $animateur) {
        echo "$animateur<br>";
    }
}

稍后,您应该尝试将查询完全从这个while ()循环中取出。

相关问题