Bon allez zou, juste pour le plaisir, j'ai réussi a faire ce que je voulais avec quelques modifications. Je poste pour que ceux qui auraient un jour la même problématique puisse s'en inspirer.
Code PHP :
<?php
function Get_available_knowledges()
{
// On va chercher les savoirs disponibles.
// Les savoirs disponibles répondent a toutes les conditions de liaison et de descendance des autres savoirs
// On va récupérer tous les child qui descendent d'au moins un savoir du country
$fief = $this->session->userdata('current_view_fief');
$potential_knowledges = $this->db->query("
SELECT knowledge.id
FROM utg_knowledge knowledge
WHERE knowledge.active = 1
AND knowledge.id
IN (
SELECT utg_knowledge_links.id_knowledge_child
FROM utg_knowledge_links
WHERE utg_knowledge_links.id_knowledge_parent
IN (
SELECT utg_country_knowledge.id_knowledge
FROM utg_country_knowledge
WHERE utg_country_knowledge.id_country = $fief
AND utg_country_knowledge.knowledge_status = 2
)
)
AND knowledge.id
NOT IN (
SELECT utg_country_knowledge.id_knowledge
FROM utg_country_knowledge
WHERE utg_country_knowledge.id_country = $fief
)
");
// On va tester tous les enfants pour isoler les evil !
$liste_rouge = array(); // Les child Evil !
$count_rouge = 0;
// On teste tous les résultats
foreach($potential_knowledges->result() as $row)
{
$child = $row->id;
// Si le child n'est pas dans la liste rouge, alors on continue, sinon inutile de faire la boucle
if(!in_array($child, $liste_rouge))
{
// On récupère l'id des parent (s)
$query = $this->db->query("
SELECT id_knowledge_parent
FROM utg_knowledge_links
WHERE id_knowledge_child = $child "
);
// S'il y a bien un parent <_<
if($query == TRUE)
{
// Pour chaque parent récupéré pour le child
foreach($query->result() as $row)
{
$parent = $row->id_knowledge_parent;
// On va vérifier que le parent est bien dans la liste de ce qu'on possède
$query2 = $this->db->query("
SELECT id_knowledge
FROM utg_country_knowledge
WHERE id_country = $fief
AND id_knowledge = $parent
");
// Si la requete retourne un résultat négatif alors on met le child en liste rouge
if($query2->result() != TRUE)
{
$liste_rouge[$count_rouge] = $child;
$count_rouge++;
//DEBUG// echo "$child = bad ; ";
}
}
}
}
}
// On a donc la liste des child invalides ($liste_rouge)
// On va reconstruire une requête pour récupérer les informations des child qui ne sont PAS dans la liste rouge
// La requête est montée sous forme de string
$query = "
SELECT knowledge.id, knowledge.name, knowledge.family, knowledge.description, knowledge.img_url,
knowledge.time_to_discover, knowledge.price
FROM utg_knowledge knowledge ";
// Compteur à 0
$count = 0;
// Pour chaque résultat (child) de la requete initiale
foreach($potential_knowledges->result() as $row)
{
// $row = l'id du child courrant
$row = $row->id;
//DEBUG// echo $row;
// Si le child N'EST PAS dans la liste rouge
if(!in_array($row, $liste_rouge))
{
//DEBUG// echo "compteur = $count ; ";
// Si le compteur est à 0 on met un WHERE
if($count == 0)
{
$query = $query."WHERE knowledge.id = $row ";
//DEBUG// echo $row;
}
// Si le compteur n'est plus à 0, on met un OR
if($count !=0)
{
$query = $query."OR knowledge.id = $row ";
//DEBUG// echo $row;
}
// Fin de tour, on augmente le compteur pour ne pas enchainer des WHERE
$count++;
}
}
//DEBUG// echo $query;
// On a notre requête $query qui est totalement finalisée sous forme de string
// On envoie finalement la requête
$available_knowledges = $this->db->query($query);
return $available_knowledges;
}
Encore une fois, merci Oxman pour ton aide, j'aurais jamais pu avancer sur la requête d'origine sans toi ^^