web-dev-qa-db-fra.com

Jdatabase: Trier deux sélections?

J'ai Jdatabase table avoir les données de présence de tous mes étudiants.

EXEMPLE:

table

Je dois afficher la présence de tous les numéros de rôle pour la classe 3. Les enregistrements ayant 3 en attended_no La colonne _ était présente et les enregistrements n’ayant pas 3 dans la attended_no colonne étaient absents.

Cela devrait être la sortie:

ABC-12-21Present

ABC-12-24Present

ABC-12-29Absent

ABC-12-37Absent

ABC-12-42Present

L'aide serait appréciée.

3
saibbyweb

Je ne crois pas que vous ayez besoin d'utiliser 2 requêtes. essayez ce qui suit:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array('roll_no', 'attended_no'))
      ->from($db->qn('#__attendance'))
      ->order('roll_no ASC');
$db->setQuery($query);
$results = $db->loadObjectList();

echo '<ul>';
foreach ($results as $row)
{
    $array = explode(',', $row->attendance_no); // convert commas to array
    $flag  = in_array(3, $array);               //check if '3' in in the array

    if ($flag == null)
    {
        $flag='absent';
    }
    else
    {
        $flag='present';
    }

    echo '<li>' . $row->roll_no . ' : ' . $flag . '</li>';
}
echo '</ul>';
4
Lodder

De la même manière, vous devez composer une requête pour renvoyer les résultats souhaités. Quelque chose comme:

SELECT P.roll_num+A.roll_num FROM PRESENT P, ABSENT A 
WHERE 
P.subject_co = A.subject_co AND P.flag = 1 AND A.flag = 0
ORDER BY P.subject_co

Au cas où vous souhaitiez renvoyer une UNION de vos requêtes précédentes, la procédure est encore plus simple:

Utilisation des méthodes d'union dans les requêtes de base de données https://docs.joomla.org/Using_the_union_methods_in_database_queries

1
Anibal

Vous pouvez économiser beaucoup de code PHP en écrivant une clause SQL SELECT raffinée avec une expression conditionnelle:

SELECT roll_num, IF(attended_no REGEXP '(^|,)3(,|$)', 'Present', 'Absent')

Démo SQL

L'expression régulière vérifie que le 3 La valeur n'est jamais précédée ni suivie d'un autre numéro - de sorte que 13 et 39 ne sont jamais faussement appariés. Le motif regex correspondra correctement si le 3 est la première valeur, la dernière valeur ou la seule valeur de la chaîne séparée par des virgules.

Que signifie l'expression régulière? Je suis content que tu aies demandé ...

(    #start of capture group 1
^    #match the start position of the input string
|    #or
,    #match a comma
)    #end of capture group 1
3    #match the literal digit 3
(    #start of capture group 2
,    #match a comma
|    #or
$    #match the end position of the input string
)    #end of capture group 2

Lorsque vous voulez comprendre ce qu’est un motif ou tester des scénarios marginaux, envoyez-le à regex101.com et faites-le vous-même .

0
mickmackusa