Bonjour à vous,
Je ne sais pas comment réalise une certaine requête en CakePHP et je sèche.

J’ai deux tables, une table actualités et une table section
Une actualité est publiée par une section, j’ai donc une clé étrangère section_id à l’intérieur de ma table Actualités. Au final, j’aurai une multitude de news publiée par des sections, et donc plusieurs news publiés par section…
J’aimerai réaliser la requête suivante. Afficher les 6 dernières actualités, mais n’afficher seulement la dernière de chaque section. (Mettre une « LIMIT » à 1 sur le champ section_id par exemple…)
Je pourrais faire des find(’first’) sur chaque section, et réinjecter mes résultats dans un tableau, mais cela me semble barbare… Bref, si vous avez la solution afin d’effectuer ce point en une seule requête, je suis preneur !
Merci d’avance

10 réponses


Rastaf86
Auteur
Réponse acceptée

Ca semble pas mal, je vais tester ça ! Merci GyZmO

Salut à toi Rastaf :)

Je n'ai pas bien compris la finalité, choisi parmis une des deux réponses ci-dessous :

La première : Récupérer les 6 dernières actus d'une section en particulier ?
La seconde : Récupérer toutes les sections avec les 6 dernières actus lié à chacunes d'entre elles.

Rastaf86
Auteur

Je souhaite afficher les 6 dernières actualités, mais je souhaite qu'il n'y ait que 1 seul actualité par section.
Si je ne rajoute pas cette dernière condition si une section publie 6 actus d'un coup, ma page sera entièrement repliée des actus de cette section. Je souhaite que chaque section apparaisse une seule foi. Je ne sais pas si je suis clair! En tout cas merci de ton intérêt. :)

Tu peut essayer avec SELECT DISTINCT en gros un example:

$this->Actualites->query("SELECT DISTINCT section_id FROM actualites order by MAX(id)");

Je pense que il y a peut être mieux à faire, mais bon comme ça de tête c'est à ça que je pense.

Rastaf86
Auteur

Je vais essayer de faire avec un distinct sur le fields section_id.

J'essaye ça dès demain et je vous tiens informé.

Merci à vous pour vos réponses :)

Rastaf86
Auteur

Pour mastertaskone , oui c'est bien ça :)

Je pense que tu peux t'en sortir en créant une View qui recherche le Max de chaque section
comme ceci (tu la crées une fois pour toute, pas la peine de la mettre dans ton code).

Create VIEW maxActu AS SELECT ID_Section, Max(ID_Actualite) AS ID_MaxActu FROM actualites GROUP BY ID_Section

Ensuite tu joins cette vue 'maxActu' à ta table 'section' par l'ID_Section et tu dois aussi joindre la table 'actualites'
pour ramener le libellé de l'actu, après il ne te reste plus qu'a limiter le nombre de sections (LIMIT 6).

SELECT S.ID_Section, A.nomActu FROM section S
 INNER JOIN maxActu MA ON (S.ID_Section = MA.ID_Section)
 INNER JOIN actualites A ON (MA.ID_MaxActu = A.ID_Actualite)
 LIMIT 6
Rastaf86
Auteur

Merci pour la réponse Huggy.

En faisant :

$sections = $this->Section->find('all', array(
    'contain' => array(
        'Actualite' => array(
            'limit' => 1,
                'order' => 'created DESC'
         )
     )
));

tu devrais récupérer toutes t'es sections avec uniquement la dernière actualité publiée

Rastaf86
Auteur

Je n'ai pas trouvé la solution que je souhaiteai, par manque de temps, je suis donc partie sur une solution à plusieurs requètes. Merci à vous pour votre aide.