|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Bonjour à tous,
Ce n'est pas la première fois que je fais appelle à vos lumières et je suis certain que je ne serai pas déçu. J'ai une requête un peu complexe à faire en sql et je bloque. Voici ce que j'ai déjà produit : Code :
La table sujets a une colonne "id", une colonne "id_gpe" qui indique dans quel groupe il est, une colonne "last_msg" qui indique la date du dernier message posté. La table derniereVisite a une colonne "id_mec" qui indique l'id de l'utilisateur, une colonne "id_sujet" qui indique l'id du sujet, une colonne "quand" qui indique la date de dernière visite de l'utilisateur dans le sujet. J'aimerai rajouter dans ma requête les sujets que l'utilisateur n'a JAMAIS visités. Est-ce que quelqu'un a une idée? Je sèche là... Merci pour l'aide que vous pourrez m'apporter. |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : décembre 2004 Messages : 1 292 ![]() |
A : Sélectionne la liste de tous les sujets.
B : Sélectionne la liste des sujets que l'utilisateur a visité. Par conséquent, A - B te donne les sujets que l'utilisateur n'a PAS visité. Il faut donc utiliser l'opérateur de soustraction en SQL. Attention, il n'existe pas sous MySQL par exemple.
__________________
Mieux vaut mobiliser son intelligence sur des conneries que sa connerie sur des choses intelligentes. [SHADOKS] Cours sur la programmation pour SmartPhones Android (Requière la lecture du cours sur la programmation Java)
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Ca paraît simple quand tu le dis!! :-)
Et du coup j'utilise mysql avec php. Je commence à m'intéresser à PDO, est-ce que ça pourrait être une alternative et donc m'autoriser la soustraction? |
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Inscription : décembre 2004 Messages : 1 292 ![]() |
Citation:
"Sélectionner la liste des sujets QUI N'EXISTENT PAS dans la liste des sujets que l'utilisateur a visité". Mais j'ai également un doute sur l'existence de la clause NOT EXIST sous MySQL Au pire, il existe une troisième technique basé sur une jointure externe sur laquelle on repérer des valeurs nulles (Cf. http://www.developpez.net/forums/d15...e-minus-mysql/)
__________________
Mieux vaut mobiliser son intelligence sur des conneries que sa connerie sur des choses intelligentes. [SHADOKS] Cours sur la programmation pour SmartPhones Android (Requière la lecture du cours sur la programmation Java)
|
|
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Merci je vais regarder ça. En attendant j'avais testé un truc comme ça :
Code :
PS: je précise que j'ai rajouté une table 'adhesion' dans laquelle je retourne tous les groupes auxquels l'utilisateur adhère. |
||
|
|
00
|
|
|
#6 | ||
![]() ![]() |
Citation:
Citation:
On peut avoir la définition des tables, un petit jeu de données et le résultat attendu car je ne suis pas bien sûr de comprendre la totalité du besoin exprimé dans le premier message ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#7 | |||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
J'ai trois tables :
- une indiquant les groupes auxquels les utilisateurs adhèrent, construite comme ça TABLE adhesion Citation:
TABLE sujets Citation:
TABLE derniereVisite Citation:
Donc là on aurait le sujet 12 car la dernière visite est supérieure et le 13 car il n'a jamais visité ce sujet (absence de résultat pour ce sujet et cet utilisateur dans la table derniereVisite) J'espère que ça sera plus clair, merci! |
|||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
J'ai déjà fait des tests avec NOT EXISTS mais ça n'avait rien donné, surement que je formulais mal ma requête.
|
|
|
00
|
|
|
#9 | ||
![]() ![]() |
Essaie cette requête :
Code :
Ça répond à ton besoin ? Comme il y a deux conditions, il vaut mieux cette fois la jointure externe.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
10
|
|
|
#10 | |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
MySQL a répondu:
Citation:
Je n'ai pas le temps de décortiquer le code pour le moment mais je jette un oeil plus concentré ce soir pour essayer de comprendre la requête et l'erreur. |
|
|
|
00
|
|
|
#11 |
![]() ![]() |
Effectivement, il y a une ligne en trop dans ma requête ! Voilà ce que c'est de ne pas se relire attentivement !
Supprime le premier LEFT OUTER JOIN.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Code :
tmp.id_sujet au lieu de tmp.id, j'ai mis des alias sur toutes les colonnes de la première table. Et j'ai rajouté un ORDER BY histoire que ça soit cohérent. Et c'est maintenant que je te dis un gros gros gros merci!!! Je vais pouvoir décortiquer cette requête histoire de comprendre. Merci infiniment! |
||
|
|
00
|
|
|
#13 | ||||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Bonsoir bonsoir!!
Je reviens à la charge après avoir fait évoluer ma requête! Aujourd'hui j'ai ça : Code :
Je suis persuadé qu'il y a moyen de l'optimiser. J'avais une version avec des jointures qui me donnait une erreur de MAX_JOIN_SIZE rows surement parce qu'elle était fausse : Code :
Pour bien comprendre, je rajoute à la situation précédente des sujets contenus dans des événements auxquels l'utilisateur participe. Avec "evt_rep" | id | id_mbr | id_evt | reponse | |key | INT | INT | 0/1/2 | (reponse : 0 -> n'y va pas, 1 -> y va, 2 -> peut-être; on ne gardera que reponse = 1) Et dans la table sujets on rajoute une colonne id_evt en précisant que quand id_gpe != 0, id_evt = 0 et inversement. Merci de l'attention que vous porterez à mon message!! |
||||
|
|
00
|
|
|
#14 | ||
![]() ![]() |
Dans seconde requête avec les jointures :
1) Puisque tu fais des jointures internes (JOIN ou INNER JOIN), pourquoi y mettre des clauses de restriction ? => Mets les dans le WHERE. 2) Puisque dans la requête principale tu ne souhaites que tmp.id_sujet et tmp.titre, et que dans la jointure externe tu n'as besoin que de tmp.mbr en plus des deux premières colonnes citées, inutile de laisser dans la sous-requête les colonnes s.id_gpe, s.id_evt. C'est toujours ça en moins à faire pour le SGBD. 3) Le ORDER BY dans la sous-requête est inutile, surtout que ce tri est sur deux colonnes que tu ne ramènes pas dans le SELECT général. Encore du boulot en moins pour le SGBD. 4) Dans la requête générale, tu ordonnes par tmp.msg mais tu n'as pas cette colonne dans le SELCT. Ce tri est-il utile ? 5) Je suppose que les %s sont des variables passées à la requête ? Puisque ce sont des identifiants, qui doivent normalement être de type entier, inutile de les mettre entre apostrophes. Voici ta requête corrigée selon ce qui précède : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#15 |
|
Nouveau Membre du Club
![]() |
Bonjour à tous,
Les posts s'entremêlent et je n'ai pas réussi à comprendre ce qui était recherché ... L'un d'entre-vous peut-il résumer le résultats attendus avec les différentes tables et leur champs ? Cordialement, |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Oui elles sont indexées, j'envisageais de passer ma table en innoDB pour pouvoir mettre des FOREIGN KEY. D'après ce que j'ai lu ça devrait rendre le boulot plus facile, donc ça pourrait rendre la requête exécutable. Parce qu'avec ta version corrigée il m'affiche encore le même message d'erreur...
Le tri sur tmp.msg est utile, je ressors les sujets par date du dernier message, sans avoir besoin d'afficher cette date. Effectivement les %s sont l'identifiant de l'utilisateur que j'ai oublié d'enlever. DUCKY je prépare un autre post avec la situation. Désolé d'être fouilli! |
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Alors je cherche à connaître la liste des sujets dans lesquels des nouveaux messages ont été postés. Pour ça, j'ai les tables suivantes :
- derniereVisite | id (INT, PRIMARY KEY) | id_mec (INT) | id_sujet (INT) | quand (INT) | Elle enregistre la date de dernière visite de l'utilisateur dans chaque sujet. - sujets | id (INT, PRIMARY KEY) | id_gpe (INT) | id_evt (INT) | last_msg (INT) | titre ( VARCHAR) | Elle enregistre tous les sujets des groupes comme des événements, si id_gpe != 0, id_evt = 0 et inversement, un sujet ne peut pas être dans un groupe et dans un événement en même temps. - adhesion | id (INT, PRIMARY KEY) | id_mbr (INT) | id_gpe (INT) | etat (0/1) | alerte (0/1) | Elle enregistre les adhésions aux groupes. Une adhésion est valide quand etat = 1 et on est abonné aux alertes quand alerte = 1. - evt_rep | id (INT, PRIMARY KEY) | id_mbr (INT) | id_evt (INT) | reponse (0/1) | Elle enregistre les réponses aux événements. L'utilisateur recevra les messages uniquement s'il va à l'événement donc si reponse = 1 Au final je cherche à afficher une liste de sujets, regroupés par groupes/événements et classés par date de dernier message, qui contiennent des messages postés après ma dernière visite dans le sujet. (je peux évidemment jongler avec php mais si sql me le fait entièrement ça serait top!) Donc il faut sélectionner la liste des groupes auxquels l'utilisateur adhère (id_gpe dans adhesion avec id_mbr = '%s', etat = 1 et alerte = 1), sélectionner la liste des événements auxquels il participe (id_evt das evt_rep avec id_mbr = '%s', reponse = 1), sélectionner la liste des sujets ayant id_gpe = (liste des groupes) et id_evt = (liste des événements), et enfin comparer la date du dernier message posté à la date de dernière visite pour derniereVisite.id_sujet = sujets.id et dernereVisite.id_mec = '%s' et sélectionner la liste des sujets ayant sujets.last_msg > derniereVisite.quand ainsi que les sujets ayant derniereVisite.id = NULL (sujets jamais visités) |
|
|
00
|
|
|
#18 | ||
![]() ![]() |
Citation:
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
10
|
|
|
#19 | |||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
requête SQL:
Code :
Citation:
|
|||
|
|
00
|
|
|
#20 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 17 ![]() |
Dans la solution que tu proposes, il me semble (si j'ai bien compris les cours de jointures) que le SGBD va joindre les 3 tables : sujets, adhesion et evt_rep.
Qui ont respectivement 490, 4254, 460 enregistrements. Du coup on se retrouve avec 490*4254*460 résultats à un moment donné non? C'est pas pour ça que ça pète? Code :
Mais ça je ne sais pas trop comment le faire... UNION? |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com