Bonjour a tous

je viens chercher quelque conseil.

j’ai 2 table, une qui contient des catégories est une qui contient des liens.

sur une page je doit afficher chaque categorie avec tous ses liens

soit je fait une jointure et j’initialise une varable $titre_categorie qui me permet d’ecrire une seul fois le titre car je ne l’affiche que si il change.

function get_catgrs_user(){
    global $db;

 $req = $db->prepare('SELECT 
 f.id as id_favrt, 
f.id_category, 
f.url as url_favrt, 
f.title as title_favrt , 
c.id as id_catgr,
c.id_user as id_user,
c.title as title_catgr 
FROM '.DB_USERS_FAVRT.' f 
    LEFT JOIN '.DB_USERS_CATGR.' c 
        ON c.id = f.id_category
WHERE c.id_user = :id_user ORDER BY f.id_category
 ');
$req->execute(array('id_user' => $_SESSION['user_id']));
$catgrs = $req->fetchAll();

return  $catgrs;
}

soit j’ajoute un champs au tableau en de sortie de la requette des categorie ou j’y ajoute tous les liens, ce qui m’oblige a faire une requette dans un foreatch.

function get_catgrs_user(){
    global $db;

    $req = $db->prepare('SELECT id, title FROM '.DB_USERS_CATGR.' WHERE id_user = :id_user ORDER BY title');
    $req->execute(array('id_user' => $_SESSION['user_id']));
    $catgrs = $req->fetchAll();

    foreach ($catgrs as $key => $value) {

        $req = $db->prepare('SELECT id, id_category, url, title FROM '.DB_USERS_FAVRT.' WHERE id_category = :id_category ORDER BY title');
        $req->execute(array('id_category' => $catgrs[$key]['id']));
        $favrt = $req->fetchAll();

        $catgrs[$key]['favorites'] = $favrt;
    }

    return  $catgrs;
}

le mieux a votr avis ?

ou une atre solution ?

mercie de votre aide.

4 réponses


betaWeb
Réponse acceptée

Salut,

La première sera beaucoup plus performante car tu ne fais qu'une seule requête ;)

JacobDelcroix
Réponse acceptée

Il faut toujours réduire au minimum le nombre de requête car c'est ce qui coûte le plus cher en terme de performance (en général).

Huggy
Réponse acceptée

Rien ne t'empêche de mesurer le temps et de nous le dire (même si je suis d'accord avec les réponses précédentes)
Avec le foreach, tu dois faire le prepare avant d'entrer dans ta boucle. Le principe c'est de préparer une fois et d'exécuter successivement avec plusieurs jeux de paramètres.
Tu peux aussi utiliser le cache de requête en ajoutant SQL_CACHE juste derrière le SELECT
le résultat sera stocké dans le cache tant que la table ne sera pas modifiée
il faut l'activer dans le my.ini / my.cnf

query_cache_size = 50m
query_cache_type = 2
#query_cache_type : 0 = off, 1 = On except SELECT SQL_NO_CACHE ... , 2 = on demand 'SELECT SQL_CACHE ..."
clementp
Auteur

oké mercie a vous !
je vais regarder ce que sont les cache en sql je ne connais pas.