php tables Problème SQL JOIN ne récupérant pas les détails de l'utilisateur de la requête et les imprimant dans le tableau



oracle outer join (1)

Vous avez une erreur logique assez importante dans votre requête SQL. Pour le simplifier un peu:

SELECT *
FROM usercert 
LEFT JOIN user ON user.iduser = usercert.iduser
INNER JOIN cert ON usercert.idcert = cert.idcert
INNER JOIN certStatus ON certStatus.idcertStatus = usercert.idcertStatus
WHERE usercert.iduser=%s AND usercert.idcert=%s

Si je comprends bien, Katie n'a aucun certificat. Donc, il n'y a pas de ligne dans usercert , donc il n'y a rien sur LEFT JOIN , donc ses informations utilisateur ne sont pas fournies.

Changez-le en

SELECT *
FROM user
LEFT JOIN usercert 
    ON usercert.iduser = user.iduser
    AND usercert.idcert = %s
LEFT JOIN cert ON cert.idcert = usercert.idcert AND 
LEFT JOIN certStatus ON certStatus.idcertStatus = usercert.idcertStatus

WHERE user.iduser = %s

AND NOT EXISTS
(SELECT * FROM `usercert` as u2 
 WHERE u2.iduser = user.iduser 
 AND u2.idcert = cert.idcert
 AND u2.idcert = usercert.idcert
 AND u2.idusercert > usercert.idusercert)

Ainsi FROM user sorte que les données de l'utilisateur est toujours inclus. Et LEFT JOIN usercert avec ce certificat SPECIFIC (si nous mettons cela dans la WHERE - WHERE il ne renvoie toujours pas de lignes).

Prime:

Et pour le rendre plus efficace (vous exécutez maintenant les requêtes count($allUsers) * count($allCertificates) , ce qui s'additionne si vous avez beaucoup d'utilisateurs):

Changez-le en:

LEFT JOIN usercert 
    ON usercert.iduser = user.iduser
    AND usercert.idcert = IN (%s, %s, %s)
[..snip..]
WHERE user.status = 'active'
AND NOT EXISTS ([..snip..])
ORDER BY user.iduser

Vous avez donc toutes les données dans une seule requête. Vérifiez que la requête donne les résultats corrects (phpmyadmin) et analysez-la en PHP.

foreach($rows as $row) {
   if (same iduser as previous) {
       add certificate to item in $users
   } else {
       $user[] = ...
   }
}

J'ai un rôle qui nécessite certains certificats nécessaires avant qu'un utilisateur puisse être affecté à ce rôle.

J'essaie de créer une liste d'utilisateurs de la base de données qui ont un ou plusieurs certificats correspondants pour ce rôle particulier. (Je ne regarde que le dernier certificat que l'utilisateur a gagné et ne compare que celui-ci au rôle)

La requête fonctionne très bien tant qu'un utilisateur possède les deux certificats requis pour ce rôle.

Si l'utilisateur ne correspond pas à tous les certificats requis, les détails des détails de ces utilisateurs ne reviennent pas.

  • D'abord, je vais vous montrer la méthode que je cours pour correspondre aux utilisateurs, puis je vais vous montrer le résultat de la sortie du tableau

  • vous verrez les 2 premiers utilisateurs (rob, holly) le tableau 0 et 1 correspondent aux deux certificats requis pour le rôle afin que toutes leurs informations telles que id, image et nom reviennent dans la première partie du tableau.

  • le 3ème utilisateur (daniel) array (2) ne correspond qu'à un seul, donc je n'obtiens pas son nom ou ses détails dans la première partie du tableau.

  • le 4ème utilisateur (katie) array (3) ne correspond à aucun, donc je renvoie un tableau complètement vide à la fin.

  • J'ai besoin à la fois de Daniel et Katie pour au moins retourner leurs noms et idimage afin que je puisse les imprimer à l'écran.

Je me suis dit que c'était quelque chose à voir avec le LEFT JOIN sur l'utilisateur mais même si je fais un JOIN JOINDRE, rien ne revient. Si je colle un joint complet, la requête échoue complètement.

 //$allcertificates contains ids of certificates required for role
 public function getStaffByProjectRoleCertificates($allCertificates)
{
    //get all active users
    $allUsers = $this->allActiveUser();
    $users = array();
    $temp = 0;

    //loop through the users to find matches
    for($i = 0; $i < count($allUsers); $i++)
    {
        $allRows = array();

        for($j = 0; $j < count($allCertificates); $j++)
        {
            $query = sprintf("
SELECT cert.certName, usercert.idusercert, usercert.usercertEnd, user.iduser, user.idimage, user.userForename, user.userSurname, certStatus.certStatusName FROM usercert 
LEFT JOIN user ON user.iduser = usercert.iduser
INNER JOIN cert ON usercert.idcert = cert.idcert
INNER JOIN certStatus ON certStatus.idcertStatus = usercert.idcertStatus


WHERE 
usercert.iduser=%s AND usercert.idcert=%s AND
NOT EXISTS
(SELECT * FROM `usercert` as u2 WHERE u2.iduser=%s AND u2.idcert=%s AND u2.idcert = usercert.idcert
AND u2.idusercert > usercert.idusercert)
",
            $this->db->GetSQLValueString($allUsers[$i], "int"),
            $this->db->GetSQLValueString($allCertificates[$j], "int"),
            $this->db->GetSQLValueString($allUsers[$i], "int"),
            $this->db->GetSQLValueString($allCertificates[$j], "int"));
            $result = $this->db->query($this->db->link, $query) or die($this->db->error($this->db->link));
            $numRows = $this->db->num_rows($result);
            $row = $this->db->fetch_assoc($result);

            array_push($allRows, $row);

            if($numRows !=0)
            {
                $temp += 1;
            }

            if($j == count($allCertificates) -1)
            {
                array_push($users, array("iduser" => $row['iduser'], 'idimage'=>$row['idimage'], 'forename'=>$row['userForename'], 'surname'=>$row['userSurname'], "cert_no" => $temp, "data"=>$allRows));
                $temp =0;
            }
         }
    }       
     function sortByOrder($a, $b)
    {
        return $b['cert_no'] - $a['cert_no'];
    }
    usort($users, 'sortByOrder');
    print_r($users);
    return $users;
}

et le tableau sorti

  Array
  (
[0] => Array
    (
        [iduser] => 90
        [idimage] => 
        [forename] => Holly
        [surname] => Bain
        [cert_no] => 2
        [data] => Array
            (
                [0] => Array
                    (
                        [certName] => Full UK Driving License
                        [idusercert] => 21
                        [usercertEnd] => 2016-05-31
                        [iduser] => 90
                        [idimage] => 
                        [userForename] => Holly
                        [userSurname] => Bain
                        [certStatusName] => Expiring In 2 Months
                    )

                [1] => Array
                    (
                        [certName] => test certificate
                        [idusercert] => 22
                        [usercertEnd] => 2016-05-31
                        [iduser] => 90
                        [idimage] => 
                        [userForename] => Holly
                        [userSurname] => Bain
                        [certStatusName] => Expiring In 2 Months
                    )

            )

    )

[1] => Array
    (
        [iduser] => 88
        [idimage] => 197
        [forename] => Robert
        [surname] => Bain
        [cert_no] => 2
        [data] => Array
            (
                [0] => Array
                    (
                        [certName] => Full UK Driving License
                        [idusercert] => 24
                        [usercertEnd] => 2017-07-01
                        [iduser] => 88
                        [idimage] => 197
                        [userForename] => Robert
                        [userSurname] => Bain
                        [certStatusName] => Expiring In 2 Months
                    )

                [1] => Array
                    (
                        [certName] => test certificate
                        [idusercert] => 19
                        [usercertEnd] => 2016-05-31
                        [iduser] => 88
                        [idimage] => 197
                        [userForename] => Robert
                        [userSurname] => Bain
                        [certStatusName] => Expiring In 2 Months
                    )

            )

    )

[2] => Array
    (
        [iduser] => 
        [idimage] => 
        [forename] => 
        [surname] => 
        [cert_no] => 1
        [data] => Array
            (
                [0] => Array
                    (
                        [certName] => Full UK Driving License
                        [idusercert] => 20
                        [usercertEnd] => 2016-05-31
                        [iduser] => 86
                        [idimage] => 196
                        [userForename] => Daniel
                        [userSurname] => Robinson
                        [certStatusName] => Expiring In 2 Months
                    )

                [1] => 
            )

    )

[3] => Array
    (
        [iduser] => 
        [idimage] => 
        [forename] => 
        [surname] => 
        [cert_no] => 0
        [data] => Array
            (
                [0] => 
                [1] => 
            )

    )

 )