MySQL, JOIN + WHERE ... AND ...
Résolu/Fermé
Rusk
Messages postés
10
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
31 mai 2010
-
Modifié par Rusk le 31/05/2010 à 00:57
Rusk Messages postés 10 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 31 mai 2010 - 31 mai 2010 à 14:38
Rusk Messages postés 10 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 31 mai 2010 - 31 mai 2010 à 14:38
A voir également:
- MySQL, JOIN + WHERE ... AND ...
- Mysql community server - Télécharger - Bases de données
- Disk boot failure insert system disk and press enter - Guide
- Your device ran into a problem and needs to restart - Forum Windows 10
- Mysql error in file: /engine/classes/mysql.php at line 53 ✓ - Forum Réseaux sociaux
- Mouse and keyboard recorder - Télécharger - Divers Utilitaires
2 réponses
Désolé, javais pas pigé la problématique.
Ton problème est qu'une ligne de keyword_join ne peut te mener qu'à un seul mot clef, alors que tu en voudrais plusieurs
le subterfuge consiste à utiliser deux fois la table keyword_join ! une première fois pour sélectionner neige et une seconde pour sélectionner noel
ça donnerait (avec ma vieille syntaxe)
select distinct g.name
from global g
, keyword_join j1
, keywords k1
, keyword_join j2
, keywords k2
where g.id = j1.id_global
and j1.id_keyword = k1.id
and k1.keyword = 'neige'
and g.id = j2.id_global
and j2.id_keyword = k2.id
and k2.keyword = 'noel'
;
Ton problème est qu'une ligne de keyword_join ne peut te mener qu'à un seul mot clef, alors que tu en voudrais plusieurs
le subterfuge consiste à utiliser deux fois la table keyword_join ! une première fois pour sélectionner neige et une seconde pour sélectionner noel
ça donnerait (avec ma vieille syntaxe)
select distinct g.name
from global g
, keyword_join j1
, keywords k1
, keyword_join j2
, keywords k2
where g.id = j1.id_global
and j1.id_keyword = k1.id
and k1.keyword = 'neige'
and g.id = j2.id_global
and j2.id_keyword = k2.id
and k2.keyword = 'noel'
;
Salut,
Je suis pas très doué en MySQL ni en JOINs qu'ils soient INNER ou OUTER... Je vais donc me contenter d'une syntaxe un peu vieillotte mais qui devrait fonctionner
A. La liste des keywords neige ou noel :
select id
from keywords
where keyword in ('neige', 'noel')
B. La liste des joints associés à neige ou noel
nb: comme l'id de keyword_join ne sert à rien, je me contente de ressortir les id_global
select j.id_global
from keyword_join j, keywords k
where j.id_keyword = k.id
and k.keyword in ('neige', 'noel')
C. La liste des noms associés à neige ou noel (avec DISTINCT pour éviter les répétitions)
select distinct g.name
from global g, keyword_join j, keywords k
where g.id = j.id_global
and j.id_keyword = k.id
and k.keyword in ('neige', 'noel')
Voilà ! J'espère que ça fonctionne chez toi et que ça te filera le coup de pouce demandé.
Je suis pas très doué en MySQL ni en JOINs qu'ils soient INNER ou OUTER... Je vais donc me contenter d'une syntaxe un peu vieillotte mais qui devrait fonctionner
A. La liste des keywords neige ou noel :
select id
from keywords
where keyword in ('neige', 'noel')
B. La liste des joints associés à neige ou noel
nb: comme l'id de keyword_join ne sert à rien, je me contente de ressortir les id_global
select j.id_global
from keyword_join j, keywords k
where j.id_keyword = k.id
and k.keyword in ('neige', 'noel')
C. La liste des noms associés à neige ou noel (avec DISTINCT pour éviter les répétitions)
select distinct g.name
from global g, keyword_join j, keywords k
where g.id = j.id_global
and j.id_keyword = k.id
and k.keyword in ('neige', 'noel')
Voilà ! J'espère que ça fonctionne chez toi et que ça te filera le coup de pouce demandé.
Rusk
Messages postés
10
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
31 mai 2010
1
Modifié par Rusk le 31/05/2010 à 00:32
Modifié par Rusk le 31/05/2010 à 00:32
Merci je connaissais pas l'opérateur IN ^^
Mais par contre ca semble pas résoudre mon "problème", car je veux les nom avec noel ET neige. Alors que l'opérateur IN est équivalent a OR
En faite ci je fait (sans DISTINCT):
Il me resort une liste du genre:
Et je veux que il me ressorte que les nom de fichier qui ont noel ET neige,
Mais en changent le OR par AND il me trouve rien car aucune entrer ne peux avoir neage ET noel en même temps.
Donc j'ai utiliser un subterfuge mais je trouve pas ca propre du tout.
Mais par contre ca semble pas résoudre mon "problème", car je veux les nom avec noel ET neige. Alors que l'opérateur IN est équivalent a OR
En faite ci je fait (sans DISTINCT):
SELECT g.name FROM global AS g INNER JOIN keywords_join AS kj ON g.id = kj.id_global INNER JOIN keywords AS k ON k.id = kj.id_keyword WHERE k.keyword = 'neige' OR k.keyword = 'noel'
Il me resort une liste du genre:
Name | keyword ------------------------------ noel-a-la-plage.jpg | noel noel-sous-la-neige.jpg | noel noel-sous-la-neige.jpg | neige blanche-neige.jpg | neige
Et je veux que il me ressorte que les nom de fichier qui ont noel ET neige,
Mais en changent le OR par AND il me trouve rien car aucune entrer ne peux avoir neage ET noel en même temps.
Donc j'ai utiliser un subterfuge mais je trouve pas ca propre du tout.
31 mai 2010 à 14:38
Par contre ca multiplie les lignes ci j'ai 20 mots clé...
Je me demande presque ci me méthode barbare est pas plus simple ^^
En tout cas merci