Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/03/2011, 15h52   #1
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Par défaut Select multiple + autre condition

Bonjour,

Ma demande est très simple, c'est juste que ca fait longtemps que je ne touche plus de sql et que je me retrouve un peu perdu pour un rien.

Voici la table en question:

----------------
table_test
----------------
id_a
id_b
----------------

Voici quelques tuples présents dans cette table:
1-301
1-303
1-229
1-609
1-708
2-301
2-609
3-766
3-555
3-301
3-909
3-123
3-777

J'aimerai trouver la requete qui me permet de trouver tous les id_a tel que ses id_b contiennent au moins les valeurs 301 et 609.
Ici il devrait me retourner l'id 1 et 2 mais pas le 3 car il ne contient que l'id_b de valeur 301.

J'avais fait ceci mais ca ne marche pas :

Code :
1
2
3
4
SELECT id_a
FROM table_test
WHERE id_b =301 
AND 609
C'est simple mais je bloque *honte*

Merci pour votre aide...
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 16h19   #2
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonjour,

Cette requête marchera s'il n'existe pas de doublon de couple id_a,id_b dans table_test :
Code :
1
2
3
4
5
SELECT id_a 
FROM table_test 
WHERE id_b IN (301,609) 
GROUP BY id_a 
HAVING count(*) =2
Sinon, il faut faire une jointure entre table_test et elle-même.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 20h04   #3
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Merci pour ta réponse =)

En effet les couples id_a et id_b sont uniques.

Une toute derniere question et je serai comblé !

Voila en fait j'aimerai rajouter une condition...

En fait la vrais requete serait:

Trouver tous les id_a tel que ses id_b contiennent au moins les valeurs 301 et 609 et au moins une de ces trois valeurs: 303 ou 229 ou 708 .
Ca devrait me retourner id_a = 1

Voila si j'ai la réponse à ca je serait comblé !!!!

Merci beaucoup pour l'aide précieuse
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 10h07   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT t1.id_a
FROM table_test t1
INNER JOIN
(
    SELECT id_a 
    FROM table_test 
    WHERE id_b IN (301,609) 
    GROUP BY id_a 
    HAVING count(*) =2
) tmp ON tmp.id_a = t1.id_a
WHERE t1.id_b IN (229, 303, 708)
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 15h09   #5
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Merci beaucoup !!! Vraiment génial


Par contre avant de mettre en résolu, c'est juste que j'aimerai savoir a titre personnel si je fais ceci:

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT t1.id_a
FROM table_test t1
INNER JOIN
(
    SELECT id_a 
    FROM table_test 
    WHERE id_b IN (301,609) 
    GROUP BY id_a 
    HAVING count(*) =2
) tmp ON tmp.id_a = t1.id_a
WHERE t1.id_b IN (229 | 303 | 708)
Cela signifie t-il bien la requete suivante ?:

Je cherche tous les id_a tel que ses id_b contiennent au moins les valeurs 301 et 609 et SEULEMENT une de ces trois valeurs: 303 ou 229 ou 708 .

C'est bien ca ?
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 15h50   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Non, il faut faire un nouveau regroupement et un comptage :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT DISTINCT t1.id_a
FROM table_test t1
INNER JOIN
(
    SELECT id_a 
    FROM table_test 
    WHERE id_b IN (301,609) 
    GROUP BY id_a 
    HAVING count(*) =2
) tmp ON tmp.id_a = t1.id_a
WHERE t1.id_b IN (229, 303, 708)
GROUP BY t1.id_a
HAVING COUNT(*) = 1
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 16h01   #7
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Ok merci
Mais ca doit être vraiment lourd là :s

Sinon j'ai remarqué que si je voulais rajouter une condition à la requete mais basé sur des champs d'une autre table je ne pouvais pas ajouter de table dans la requete....

Où dois je rajouter table_test_b, ma jointure et ma condition toute bete comme
And table_test_b.id = 3.

Désolé je ne pensais pas que j'aurai besoin de tout ca :s

Je pense qu'après cette question j'aurai tout ce dont il me faudra pour finir mon site web

Merci encore, j'aime pas déranger :/
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 16h12   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par ghostfile Voir le message
Ok merci
Mais ca doit être vraiment lourd là :s
Si ta BDD est bien modélisée et bien indexée et si tu n'as pas à traiter des dizaines de millions de lignes, ça devrait passer comme une lettre à la poste.

Citation:
Sinon j'ai remarqué que si je voulais rajouter une condition à la requete mais basé sur des champs d'une autre table je ne pouvais pas ajouter de table dans la requete....

Où dois je rajouter table_test_b, ma jointure et ma condition toute bete comme
And table_test_b.id = 3.
Tu peux montrer ce que tu as essayé et expliquer en détail le besoin ?
Ainsi que l'éventuel message d'erreur ou résultat erroné obtenu ?
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 16h46   #9
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
D'accord
En fait oui j'aurai peut etre des millions de lignes à traiter :/ gros probleme ?

Sinon ma requete est un peu plus complexe, je vais aller plutot droit au but car je voulais ne pas t'embéter avec de longues requetes et puis me débrouiller tout seul avec les bases que tu m'avais fournis mais bon je n'y parviens pas du tout.

En fait mon site sera une sorte de "moteur de recherche" et il y aura donc des tas de critères avec possibilité ou non de faire une recherche exact.

Ma table_test est une table de liaison et lie donc une table contenu plein d'objets qui ont chacun les mêmes propriétés mais qui peuvent ne pas avoir les memes valeurs.

Voici donc trois tables (plus concrètes que table_test_a) :

----------------
table_couleur
----------------
id_couleur
nomCouleur
proprieteCouleur
codeCouleur
...
etc
----------------



----------------
table_liaison
----------------
id_objet
id_couleur
----------------



----------------
table_objet
----------------
id_objet
nom
autonomie
fiche
url
...
image
----------------

Le truc c'est que je risque d'avoir des gens qui demanderont ce genre de requête (je te donne la plus compliqué que je puisse trouver selon moi):


Je cherche tous les objets (de table_objet) qui sont cnstitués obligatoirement des trois couleurs d'id_couleur 1,4,8 et qui contiennent aussi obligatoirement une seule de ces couleurs de la liste suivante: 122,143 ET obligatoirement une seule couleur de cette liste : 398,765,454,333
PUIS que l'autonomie (de la table table_objet) soit égale à 120.

Voila :/

La requete que j'ai fait suite à ton aide a été la suivante:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT DISTINCT t1.id_objet
FROM table_liaison t1, table_objet 
INNER JOIN
(
    SELECT id_objet 
    FROM table_liaison 
    WHERE id_couleur IN (1,4,8) 
    GROUP BY id_objet 
    HAVING count(*) =3
) tmp ON tmp.id_objet = t1.id_objet
WHERE t1.id_couleur IN (122, 143)
GROUP BY t1.id_objet
HAVING COUNT(*) = 1
AND t1.id_couleur IN (398, 765, 454, 333 )
GROUP BY t1.id_objet
HAVING COUNT(*) = 2
 
AND table_objet.id_objet = t1.id_objet
AND autonomie = 120


Bon meme moi je comprends pourquoi ca ne marche pas...syntaxiquement c'est archi faux mais comme je ne travaille jamais avec les GROUP BY et HAVING je dois dire que pour une fois je suis bien embêté...

As tu compris ma "vraie" demande ?


Merci beaucoup pour ton aide parce que seul je n'y arriverai pas. Pourtant j'essaye encore et toujours...
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 17h40   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Citation:
Je cherche tous les objets (de table_objet) qui sont constitués obligatoirement des trois couleurs d'id_couleur 1,4,8 et qui contiennent aussi obligatoirement une seule de ces couleurs de la liste suivante: 122,143 ET obligatoirement une seule couleur de cette liste : 398,765,454,333
PUIS que l'autonomie (de la table table_objet) soit égale à 120.
Quand tu es face à un problème complexe, décompose-le en problèmes plus simples !

Citation:
Je cherche tous les objets (de table_objet) qui sont cnstitués obligatoirement des trois couleurs d'id_couleur 1,4,8
Ceci est effectivement donné par la sous-requête :
Code :
1
2
3
4
5
    SELECT id_objet 
    FROM table_liaison 
    WHERE id_couleur IN (1,4,8) 
    GROUP BY id_objet 
    HAVING count(*) =3
Citation:
et qui contiennent aussi obligatoirement une seule de ces couleurs de la liste suivante: 122,143
Ceci est donné en complément par un second regroupement inspiré de celui donné dans mon précédent message :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT t1.id_objet
FROM table_liaison t1
INNER JOIN
(
    SELECT id_objet 
    FROM table_liaison 
    WHERE id_couleur IN (1,4,8) 
    GROUP BY id_objet 
    HAVING count(*) =3
) t2 ON t2.id_objet = t1.id_objet
WHERE t1.id_couleur IN (122, 143)
GROUP BY t1.id_objet
HAVING COUNT(*) = 1
Citation:
ET obligatoirement une seule couleur de cette liste : 398,765,454,333
Et bien faisons un nouveau regroupement par dessus les deux premiers !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT t3.id_couleur
FROM table_liaison t3
INNER JOIN
(
    SELECT t1.id_objet
    FROM table_liaison t1
    INNER JOIN
    (
        SELECT id_objet 
        FROM table_liaison 
        WHERE id_couleur IN (1,4,8) 
        GROUP BY id_objet 
        HAVING count(*) =3
    ) t2 ON t2.id_objet = t1.id_objet
    WHERE t1.id_couleur IN (122, 143)
    GROUP BY t1.id_objet
    HAVING COUNT(*) = 1
) t4 ON t4.id_objet = t3.id_objet
WHERE t3.id_couleur IN (398, 765, 454, 333)
GROUP BY t3.id_couleur
HAVING COUNT(*) = 1
Citation:
PUIS que l'autonomie (de la table table_objet) soit égale à 120
En fait, cette autonomie concernera l'objet qui est le même du début à la fin donc au lieu de dire PUIS et de vouloir mettre la condition sur le dernier regroupement, il vaut mieux directement le mettre sur la première sous-requête pour limiter les lignes à joindre. Et pour ça, comme l'autonomie figure dans la table_objet, il faut la joindre à la table_liaison :
Code :
1
2
3
4
5
6
7
        SELECT o.id_objet 
        FROM table_liaison l
        INNER JOIN table_objet o ON o.id_objet = l.id_objet
        WHERE l.id_couleur IN (1,4,8) 
            AND o.autonomie = 120
        GROUP BY o.id_objet 
        HAVING count(*) =3
Ce qui donne au final cette requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT t3.id_couleur
FROM table_liaison t3
INNER JOIN
(
    SELECT t1.id_objet
    FROM table_liaison t1
    INNER JOIN
    (
        SELECT o.id_objet 
        FROM table_liaison l
        INNER JOIN table_objet o ON o.id_objet = l.id_objet
        WHERE l.id_couleur IN (1,4,8) 
            AND o.autonomie = 120
        GROUP BY o.id_objet 
        HAVING count(*) =3
    ) t2 ON t2.id_objet = t1.id_objet
    WHERE t1.id_couleur IN (122, 143)
    GROUP BY t1.id_objet
    HAVING COUNT(*) = 1
) t4 ON t4.id_objet = t3.id_objet
WHERE t3.id_couleur IN (398, 765, 454, 333)
GROUP BY t3.id_couleur
HAVING COUNT(*) = 1
Il y a peut-être plus simple mais pour un vendredi soir, je dirais que c'est déjà pas mal !

Et comme tout ça ne manipule que des entiers de colonnes indexées, même avec des millions de lignes, le temps de réponse devrait être satisfaisant.
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 19h53   #11
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Merci beaucoup C'est très agréable de voir que des gens aident si gentillement les internautes qui galere dans des domaines qui ne sont pas les leurs (principalement...).

Cela dit une erreur apparait :

#1054 - Unknown column 't4.id_liaison' in 'on clause'



Un autre vrai probleme est de savoir comment construire automatiquement ce genre de requete en PHP... parce qu'il pourrait tres bien y avoir 10 listes avec a chaque fois le choix sur un seul id présent dans ces listes...

J'ai donc décidé de traiter cette requete en deux temps...
Je m'occuperai donc juste de la partie permettant de trouver tous les id. (sans prendre en compte la jointure pour le parametre autonomie).


Ainsi j'ai essayé ceci mais ca ne marche pas :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT t3.id_couleur
FROM table_liaison t3
INNER JOIN
(
    SELECT t1.id_objet
    FROM table_liaison t1
    INNER JOIN
    (
        SELECT id_objet
        FROM table_liaison 
        GROUP BY id_objet 
        HAVING count(*) =3
    ) t2 ON t2.id_objet = t1.id_objet
    WHERE t1.id_couleur IN (122, 143)
    GROUP BY t1.id_objet
    HAVING COUNT(*) = 1
) t4 ON t4.id_objet = t3.id_objet
WHERE t3.id_couleur IN (398, 765, 454, 333)
GROUP BY t3.id_couleur
HAVING COUNT(*) = 1


Je ne veux pas du tout me faire passer pour quelqu'un qui n'est jamais content mais y a t-il moyen de supprimer certain alias que tu as mis et qui seraient inutiles ?
Si ca peut aider à en supprimer il faut savoir qu'en fait les champs ont tous des libelles différents.
Ainsi id_objet de la table table_liaison s'appelle en réalité id_objet_liaison et id_couleur de la table table_liaison s'appelle id_couleur_liaison.

De plus serais tu formuler la meme requete mais avec des jointure moins complexes ? Dans le sens ou au lieu d'utiliser INNER JOIN, utiliser simplement la syntaxe FROM table1,table2 WHERE table1.id = table2.id ?

Je ne sais pas si tu vois ce que je veux dire mais en fonction des champs sélectionnés mes requetes seront générés en PHP et donc il faut que ce soit le plus court possible (et donc sans utiliser d'alias si possible) :/

Je sais que j'en demande beaucoup mais c'est pas tous les jours que je serai embêté par un tel probleme. Ca fait deux jours que mon developpement s arrété à cause d'une requete SQL que je ne parvient pas à formuler et a adapter en PHP ...

Merci pour ta réponse et encore désolé si je semble trop vouloir en demander
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 23h09   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par ghostfile Voir le message
Cela dit une erreur apparait :

#1054 - Unknown column 't4.id_liaison' in 'on clause'
Bizarre, il n'y a pas de t4.id_liaison dans ma requête !
Tu es sûr de l'avoir bien recopiée ?

Citation:
Un autre vrai probleme est de savoir comment construire automatiquement ce genre de requete en PHP... parce qu'il pourrait tres bien y avoir 10 listes avec a chaque fois le choix sur un seul id présent dans ces listes...
Là on sort du cadre du présent forum. Et c'est vrai qu'une telle requête à automatiser en PHP, ça ne doit pas être très évident. Il vaut peut-être mieux le faire alors en plusieurs requêtes créant des tables temporaires mais pas sûr que la performance soit au rendez-vous. Bref, pas le temps d'étudier ça maintenant.

Citation:
J'ai donc décidé de traiter cette requete en deux temps...
Je m'occuperai donc juste de la partie permettant de trouver tous les id. (sans prendre en compte la jointure pour le parametre autonomie).
La jointure pour restreindre l'autonomie n'est à mon avis pas pénalisante puisqu'elle est dans la première sous-requête.

Citation:
Ainsi j'ai essayé ceci mais ca ne marche pas :
Symptômes ? Erreur ? Pas de résultat ? Pas le résultat attendu ?

Citation:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT t3.id_couleur
FROM table_liaison t3
INNER JOIN
(
    SELECT t1.id_objet
    FROM table_liaison t1
    INNER JOIN
    (
        SELECT id_objet
        FROM table_liaison 
        GROUP BY id_objet 
        HAVING count(*) =3
    ) t2 ON t2.id_objet = t1.id_objet
    WHERE t1.id_couleur IN (122, 143)
    GROUP BY t1.id_objet
    HAVING COUNT(*) = 1
) t4 ON t4.id_objet = t3.id_objet
WHERE t3.id_couleur IN (398, 765, 454, 333)
GROUP BY t3.id_couleur
HAVING COUNT(*) = 1
Code :
1
2
3
4
        SELECT id_objet
        FROM table_liaison
        GROUP BY id_objet
        HAVING count(*) =3
Tu as enlevé le WHERE l.id_couleur IN (1,4,8) ! Du coup tu prends tous les objets qui sont présents 3 fois dans la table de liaison sans distinction des couleurs !

Citation:
y a t-il moyen de supprimer certain alias que tu as mis et qui seraient inutiles ?
Les alias ne sont là que pour simplifier la lecture de la requête et certains sont indispensables : ceux donnant un nom aux sous-requêtes pour qu'on puisse considérer celles-ci comme des "tables".

Citation:
Si ca peut aider à en supprimer il faut savoir qu'en fait les champs ont tous des libelles différents.
Ainsi id_objet de la table table_liaison s'appelle en réalité id_objet_liaison et id_couleur de la table table_liaison s'appelle id_couleur_liaison.
Ben si tu ne donnes pas la vraie structure de tes tables, je ne peux pas les deviner !
À toi d'adapter mon code aux vrais noms ! Et les alias n'ont rien à voir avec les noms de colonnes puisque ce sont des alias pour les noms des tables ou pour les sous-requêtes.

Citation:
De plus serais tu formuler la meme requete mais avec des jointure moins complexes ? Dans le sens ou au lieu d'utiliser INNER JOIN, utiliser simplement la syntaxe FROM table1,table2 WHERE table1.id = table2.id ?
Mauvaise idée ! La syntaxe normalisée depuis 1992 pour les jointures utilise JOIN, ce qui est beaucoup plus clair que l'ancien mélange entre les conditions de jointure et de restriction dans le WHERE et qui engendrait facilement des erreurs ; je ne compte plus les requêtes que j'ai ainsi corrigées dans nos forums rien qu'en y mettant la syntaxe normalisée !

Citation:
Je ne sais pas si tu vois ce que je veux dire mais en fonction des champs sélectionnés mes requetes seront générés en PHP et donc il faut que ce soit le plus court possible (et donc sans utiliser d'alias si possible) :/
Il n'y a aucun problème à faire une requête longue en PHP ! Et les alias n'en sont pas non plus !

Citation:
Ca fait deux jours que mon developpement s arrété à cause d'une requete SQL que je ne parvient pas à formuler et a adapter en PHP ...
Et si tu exprimais clairement le processus qui aboutit à ce besoin de requête un poil complexe ? Parce qu'un ensemble de 3 couleurs + 1 parmi un autre ensemble + 1 parmi un autre ensemble, c'est quand même pas banal !
Tu vends des patchworks ou quoi ?
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 00h04   #13
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Tout d'abord encore merci pour tes réponses.

Non je ne vends pas ca... lol
Disons que c'est assez confidentiel et que je ne peux pas donner la vraie structure de mes tables.
Concernant la nouvelle structure c'est peut etre mieux niveau SQL mais disons que moi je dois les générer avec du PHP, j ai une page script hyper complexe et en fonction du formulaire qui m'est renvoyé par un submit, je dois construire la requete... sauf qu'avec tous ces alias je ne peux malheureusement pas le faire.

En fait je vais décomposer la requête en deux fois. Donc en premier lieu (et c'est simplement ca que je voudrai savoir en fait :p) la requête que j'ai formulé précédemment sans prendre en compte la condition portant sur l'autre table...

Citation:
La jointure pour restreindre l'autonomie n'est à mon avis pas pénalisante puisqu'elle est dans la première sous-requête.
=> Je te disais ca car comme je l'ai écris juste avant, j'aurai du mal a créer la structure en php étant donné les multiples possibilités qu'il pourra y avoir...


Concernant l'erreur c'était de ma faute, j'ai mal adapté ton script autant pour moi.


Je suis vraiment embété par ta structure. Tout en restant "moderne" peut-on éviter une jointure dans le FROM ? Et faire une jointure dans le WHERE ? (meme en utilisant le JOIN si u veux :p).
C'est juste que ca simplifierait énormément mon script PHP et pour tout dire ca le rendrait "réalisable"
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 08h12   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Citation:
Je suis vraiment embété par ta structure. Tout en restant "moderne" peut-on éviter une jointure dans le FROM ? Et faire une jointure dans le WHERE ? (meme en utilisant le JOIN si u veux :p).
Ancienne syntaxe de jointure, obsolète depuis bientôt 19 ans :
Code :
1
2
FROM une_table, une_autre_table
WHERE condition_de_jointure
Syntaxe normalisée depuis 1992, bien meilleure que l'ancienne :
Code :
1
2
FROM une_table
[INNER] [LEFT] [RIGHT] [OUTER] JOIN une_autre_table ON condition_de_jointure
Il faut choisir ! Mais autant respecter la norme en vigueur depuis longtemps !

Citation:
Je suis vraiment embété par ta structure.
La structure de ma requête est imposée par l'expression de ton besoin, sauf si quelqu'un d'autre trouve une solution plus simple. Ou alors exprime ton besoin différemment et je trouverais peut-être une autre solution. Sans explication complémentaire, je ne comprends pas de quoi il s'agit ni pourquoi tu as ce besoin tordu.
Si tu ne peux dévoiler le domaine confidentiel sur lequel tu travailles, essaie de trouver une analogie. Il existe plein d'objets multicolores.
Quel est le processus qui justifie ces contraintes sur la requête ?
Parce qu'avec 3 regroupements imbriqués, les performances devraient encore être acceptables mais si tu en as potentiellement une dizaine, ça risque de devenir problématique.

Je m'absente tout le week-end donc prochaine réponse lundi. Ça te laisse le temps de réfléchir.

A+
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 10h55   #15
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Ok pour la syntaxe normalisée, si elle est bien mieux performante alors pourquoi pas

Et concernant les regroupements imbriqués il pourrait y en avoir 10 au maximum... Je sais bien que cela fait beaucoup mais je n'ai pas d'autres choix, hélas.

Citation:
Il existe plein d'objets multicolores.
Quel est le processus qui justifie ces contraintes sur la requête ?
Disons qu'en gros j'ai une liste déroulante (à choix multiple donc on peut sélectionner autant de valeur que l'on veut) se présentant comme ceci:

- couleurs -
bleu
bleu1
bleu2
bleu3
bleu4
vert
vert1
vert2
rouge
rouge1
rouge2
rouge3
rouge4
rouge5
rouge6
jaune
jaune1
jaune2
orange
orange1
orange2
orange3
orange4


L'idée c'est que si l'utilisateur choisi ces valeurs:
bleu, vert3,jaune,orange5

Il est donc évident de penser que l'utilisateur désirerait voir n'importe quel bleu et jaune dans son objet car il a spécifier une catégorie...

Donc la requête formulée devrait être:
Je cherche un objet étant composé de ces deux couleurs obligatoirement: vert3 et orange5, puis qui contiennent une des valeurs de cette liste (bleu1,bleu2,bleu3,bleu4) et une des valeurs de cette liste (jaune1,jaune2).


Je vais regarder ca durant tout ce week end, merci et bon week end !
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 09h26   #16
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 995
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 995
Points : 18 253
Points : 18 253
Envoyer un message via MSN à CinePhil
Citation:
si l'utilisateur choisi ces valeurs:
bleu, vert3,jaune,orange5
Citation:
- couleurs -
bleu
bleu1
bleu2
bleu3
bleu4
vert
vert1
vert2
rouge
rouge1
rouge2
rouge3
rouge4
rouge5
rouge6
jaune
jaune1
jaune2
orange
orange1
orange2
orange3
orange4
Si tes couleurs s'appellent vraiment comme ça, alors utilise simplement LIKE 'la_couleur_choisie%'.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT o.id_objet 
FROM table_liaison l
INNER JOIN table_objet o ON o.id_objet = l.id_objet
INNER JOIN table_couleur c ON c.id_couleur = l.id_couleur
WHERE o.autonomie = 120
    AND 
    (
        l.nomCouleur LIKE 'bleu%' 
        OR l.nomCouleur LIKE 'vert3%'
        OR l.nomCouleur LIKE 'jaune%'
        OR l.nomCouleur LIKE 'orange5%'
    )
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h54   #17
Invité de passage
 
Inscription : février 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 55
Points : 2
Points : 2
Salut,

J'étais absent pendant pas mal de jours.
Je vais valider ce topic !

Merci énormément pour ton aide !

A bientot !
ghostfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h39.


 
 
 
 
Partenaires

Hébergement Web