JeuWeb - Crée ton jeu par navigateur
Requete avec plusieurs contraintes - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Requete avec plusieurs contraintes (/showthread.php?tid=7211)

Pages : 1 2 3


Requete avec plusieurs contraintes - hercull - 12-06-2014

Bonjour,

j'ai ma table forum_reponses qui est composé comme ceci:

(forum_reponses_ID, auteur_pseudo, message, date_reponse, correspondance_sujet, categorie1)

je dois faire une requête MYSQL mais comme il y a plusieurs contrainte je n'y arrive pas.

Je dois retourner le dernier auteur à avoir poster une réponse dans chaque catégorie(il y en a 12).

exemple : categorie 1 : paul
categorie 2 : jean....

J'ai eseyeé avec MAX() avec LIMIT je n'y arrive pas.

Merci de votre aide.

Cordialement.


RE: Requete avec plusieurs contraintes - Racktor - 12-06-2014

je vais peut-être dire un connerie mais en faisant un ORDER BY date_reponse LIMIT 1 ?


RE: Requete avec plusieurs contraintes - Sephi-Chan - 12-06-2014

Je crois que son problème est plutôt d'inclure pour chaque sujet la dernière réponse.
Le plus souvent (dans ce que j'ai vu), on le fait en dénormalisant : en stockant l'ID de la dernière réponse dans la table des sujets.


RE: Requete avec plusieurs contraintes - Racktor - 12-06-2014

oui effectivement ...

Ha c'est ca dénormaliser ....


RE: Requete avec plusieurs contraintes - niahoo - 12-06-2014

Oui dénormaliser c'est quand tu ne respecte pas volontairement les formes normales dans ton schéma de données.

plus d'infos : http://fr.wikipedia.org/wiki/Forme_normale_(bases_de_données_relationnelles)


RE: Requete avec plusieurs contraintes - Xenos - 12-06-2014

Citation :Je dois retourner le dernier auteur à avoir poster une réponse dans chaque catégorie(il y en a 12).

Donc, je suppose qu'il s'agit de renvoyer les 12 catégories, avec l'auteur du dernier message pour chaque catégorie (et pas le dernier auteur à avoir posté dans chacune des 12 catégories).

Je vois un champ `forum_reponses`.`forum_reponses_id` donc je suppose qu'il s'agit d'une clef primaire, auto incrémentée... On pourrait s'en servir, en considérant que si id1 < id2 alors date1 < date2 (un message plus récent qu'un autre aura un ID plus grand).:


SELECT `forum_reponses`.`categorie`, `forum_reponses`.`auteur_pseudo`
FROM
(
SELECT MAX(`forum_reponses`.`forum_reponses_id`) AS `max_id`
FROM `forum_reponses`
GROUP BY `forum_reponses`.`categorie`
) AS `forum_reponses_max_ids`
LEFT JOIN `forum_reponses` ON `forum_reponses_max_ids`.`max_id` = `forum_reponses`.`forum_reponses_id`
LIMIT 12

Non testé, mais cela me semble être un approche pas trop crade pour des perfs correctes.
Indexer les colonnes "forum_reponses_id" et "categorie" me semble indispensable.


RE: Requete avec plusieurs contraintes - Arnadus - 12-06-2014

J'pense qu'un truc dans le genre pourrait fonctionner aussi, dis-moi si ça marche!

selon la date (plus intuitif):

select categorie, 
(select auteur from forum_reponses as forum_reponses2 where forum_reponses2.categorie = forum_reponses.categorie order by date_reponse desc limit 1 ) as nom_auteur
from forum_reponses
group by categorie

selon l'id (plus malin):

select categorie, 
(select auteur from forum_reponses as forum_reponses2 where forum_reponses2.categorie = forum_reponses.categorie order by forum_reponses_id desc limit 1 ) as nom_auteur
from forum_reponses
group by categorie

ps: GG xenos!


RE: Requete avec plusieurs contraintes - hercull - 13-06-2014

Bonjour,

Toute les requête fonctionne bien merci, mais comment se fait il que la requête de xenos et de arnadus donne le même résultat?? vu que celle de xenos est plus complexe?

Maintenant que le probleme de la requête est réglé je rencontre un probleme pour l'affichage.
En effet normalement pour afficher mes résultats j'utilise cette méthode:

Code :
$reponse = mysql_query($r);

$array = Array();

    while($do = mysql_fetch_assoc($reponse)) {
        
        array_push($array, $do['nom_auteur']);
        
  
    }

echo $array[0];

mais dans le cas présent cela ne fonctionne pas car afficher les résultats en fonction de l'array est faut dans le cas ou une des catégorie ne contient aucun message par exemple.

Donc, ce que je veux faire :
catégorie 1 : dernier auteur d'une réponse : jean
catégorie 2 : dernier auteur d'une réponse : pierre
...
récupérer le nom en fonction de la catégorie et non en fonction de l'array.
Je précise que je ne veux pas afficher le résultat dans une boucle mais en dehors de la boucle (tableau statique(en dur) mais donnée qui le remplisse dynamique).

J’espère être clair lol.

Cordialement.




RE: Requete avec plusieurs contraintes - Arnadus - 13-06-2014

Citation :mais dans le cas présent cela ne fonctionne pas car afficher les résultats en fonction de l'array est faut dans le cas ou une des catégorie ne contient aucun message par exemple.

Donc, ce que je veux faire :
catégorie 1 : dernier auteur d'une réponse : jean
catégorie 2 : dernier auteur d'une réponse : pierre

Disposes-tu d'une table contenant tous les noms de catégorie?


RE: Requete avec plusieurs contraintes - Xenos - 13-06-2014

La requête d'Arnadus est plus proche du langage naturel (problème exprimé en français): le SGDB risque de parcourir une fois la table des réponses, de grouper par catégorie, et d'exécuter 12 fois la sous-requête entre les parenthèses.

La mienne est plus ensembliste: le SGDB devrait parcourir une fois la table des réponses, grouper par catégorie et prendre l'id max, puis faire la jointure avec la table des réponses.

Donc dans le premier cas, on risque d'avoir (1+12*1) soit 13 parcours de la table de réponses (mais je n'ai pas tenu compte du order by ni du limit 1), dans le second cas, on ne devrait avoir que (1+1) soit 2 parcours de la table des réponses.

A vérifier, mais la requête d'Arnadus risque d'être plus longue quand le nombre de messages (ou de catégories) augmentera.


S'il y a des trous (catégories vides), tu peux initialiser le tableau, donc lancer une requête pour récupérer la liste des catégories, initialiser ton tableau PHP en indiquant que chaque catégorie est vide, puis exécuter la requête pour récupérer le dernier posteur de chaque catégorie et modifier le tableau PHP en conséquence.