billcom Posté 18 Mars 2015 Posté 18 Mars 2015 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 Merci d'avance.
Portekoi Posté 18 Mars 2015 Posté 18 Mars 2015 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
billcom Posté 23 Mars 2015 Auteur Posté 23 Mars 2015 Bonjour, j'étais en déplacement pro depuis mercredi. Merci pour vos réponses je vais tester ça aujourd'hui
billcom Posté 23 Mars 2015 Auteur Posté 23 Mars 2015 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
Portekoi Posté 23 Mars 2015 Posté 23 Mars 2015 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;
Portekoi Posté 23 Mars 2015 Posté 23 Mars 2015 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))
Portekoi Posté 24 Mars 2015 Posté 24 Mars 2015 Si tu me dis que ça ne marche pas, je mange mon clavier
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant