Jump to content

Requête multiple qui ralentit page web


billcom

Recommended Posts

Bonjour à tous,



J'ai, sur un site d'offre d'emploi, une liste de domaines et plusieurs offres.



Chaque offre à un domaine correspondant.



Structure des tables :


  • table domaine
    • id_domaine
    • nom_domaine
    • ...

  • table offre
    • id_offre
    • id_domaine
    • date
    • ...

Sur une page du site, j'aimerai lister tous les domaines ainsi que les trois dernières offres du domaine en question.



Pour avoir ce résultat, je fais actuellement :


  • Une requête qui récupère les domaines;
  • Puis quand j'affiche les domaines avec un foreach(), je fais une requête qui récupère les 3 dernières offres correspondant au domaine courant.

Le problème, c'est que faire une requête dans une boucle n'a jamais été top et effectivement la page est longue à charger.



J'ai alors mis en cache la requête (remember / j'utilise le framework Laravel) afin que la page soit plus rapide. Cependant au premier chargement la page met très longtemps a apparaître.



J'aimerai optimiser ce premier chargement.



J'ai essayé de faire une requête avec une sous-requête mais sans succès et je ne sais même pas si c'est possible.



Si vous êtes un champion de SQL ou que vous voyer la faille dans mon raisonnement, j'attend votre aide thumbup.gif



Merci d'avance.


Link to comment
Share on other sites

Bonjour,



C'est possible avec une sous-requête :



SELECT domaine.Nom, offre.*
FROM domaine inner join (
SELECT Nom, id_offre
FROM Offre
order by date desc
LIMIT 0 , 3
) AS offre ON domaine.id_domaine = offre.id_domaine
WHERE 1
order by domaine.nom

A tester mais cela devrait marcher.




Portekoi


Link to comment
Share on other sites

Fonctionnelle :



set @num := 0, @domaine_id := '';

select * from(
select domaine.nom as domaine_nom, offre.id, offre.nom as offre_nom, offre.domaine_id,
@num := if(@domaine_id = domaine_id, @num + 1, 1) as nb,
@domaine_id := domaine_id as var
from offre inner join domaine on offre.domaine_id = domaine.id
group by domaine.nom, offre.id, offre.nom, domaine_id
having nb <= 2
) as tt
order by domaine_nom, offre_nom desc;
Link to comment
Share on other sites

Pour avoir les deux premières offres pour chaque domaine (attention aux ressources / à tester)



select m.id, m.nom as offre_nom, m.domaine_id
from offre as m
where m.id = (
select max(id) from offre where domaine_id = m.domaine_id)
or m.id = (
select max(id) from offre where domaine_id = m.domaine_id and id not in (select max(id) from offre where domaine_id = m.domaine_id))


Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...