Aller au contenu

Sujets conseillés

Posté

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.


Posté

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


Posté

Bonjour, j'étais en déplacement pro depuis mercredi.



Merci pour vos réponses je vais tester ça aujourd'hui thumbup.gif


Posté

Alors, as tu pu tester?

Je viens de tester la requête, cela liste 3 résultats uniquement et non les 3 dernières offre de chaque domaine.

Merci encore

Posté

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;
Posté

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))


Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...