Page 1 sur 1

Requête MySQL

Posté : 26 déc. 2013, 03:54
par Jacques2014
Bonsoir à vous tous,

Pourriez vous m'aider pour créer une requête SQL (depuis un script PHP)

J'ai deux tables :
La première "Titre" (titre d'un morceau musical)
Avec comme champs (entre autre) : "id_tit", "titre", "Pays" ...etc.

La deuxième table "Specificites" (Des spécificités divers comme : Les instruments à vent, les instruments à cordes, ... etc.)
Avec comme champs (entre autre) : "specs_id", "specs_nom", "id_tit", ...etc.

J'ai un formulaire qui (devrait) permet de faire des recherches sur des titres, joués dans un pays, interprétés par 2 cordes et 3 vents (par exemple)

J'ai commencé par :
SELECT * FROM titre AS a, specs AS b 
WHERE (a.pays LIKE '10' )
AND (b.specs_id LIKE '29' ) // ID 29 est guitare
AND (b.specs_id LIKE '70' ) // ID 70 est Batterie
AND (b.specs_id LIKE '38' ) // ID 38 est Contrebasse
AND (b.specs_id LIKE '43' ); // ID 43 est piano
Cela n'a rien retourné... alors qu'il existe certains morceaux avec ces spécificités.

Alors j'ai modifié suivant des choses que j'ai trouvé sur Internet par :
SELECT *
			
FROM titre AS a
INNER JOIN specs AS b ON ( a.id_tit= b.id_tit)
WHERE (
(a.pays LIKE '10' ) 
AND (b.specs_id LIKE '29')  // ID 29 est guitare
AND (b.specs_id LIKE '70')  // ID 70 est Batterie
AND (b.specs_id LIKE '38')  // ID 38 est Contrebasse
AND (b.specs_id LIKE '43')  // ID 43 est piano
);			
Mais toujours rien ?
J'ai même écris directement ces requêtes dans PhpMyAdmin et cela n'a rien retourné, ni même une erreur ?

Pourriez vous m'aider ou m'aiguiller ?

Merci
Jacques.

Re: Requête MySQL

Posté : 26 déc. 2013, 09:47
par sirakawa
teste:
select * FROM titre AS a INNER JOIN specs AS b ON ( a.id_tit = b.id_tit);
pour voir si ça donne un résultat plausible.

Re: Requête MySQL

Posté : 26 déc. 2013, 12:52
par Jacques2014
Bonjour sirakawa,
Merci de ton aide.

J'ai essayé ce que tu proposais et sur PhpMyAdmin apparait toutes les titres, fois le nombre de spécificités qu'ils sont.
Si un titre à 10 spécificités il apparait 10 fois dans le résultat de recherche.

Alors avec un "DISTINCT" cela fonctionne mieux... Mais je n'ai que les infos que je met dans le "DISTINCT (a.id_tit) ici seulement les id de la table "Titre".

Dois-je le faire avec deux requêtes distinctes ?

Une sur la table "Titres" (avec éventuellement le Pays), puis dans le "WHILE" faire un nouveau test sur les spécificités ?

Merci de ton aide

Jacques

Re: Requête MySQL

Posté : 26 déc. 2013, 13:21
par sirakawa
maintenant que tu sais que ton point de départ a l'air correct,
SELECT *
                         
FROM titre AS a
INNER JOIN specs AS b ON ( a.id_tit= b.id_tit)
WHERE (
(a.pays LIKE '10' )
et si ça va, continue.
Au fait LIKE '10' servirait si tu mettais LIKE '1%" (tous les pays commençant par 1) par exemple. Sinon = '10' suffit largement et doit aller un brin plus vite.

Re: Requête MySQL

Posté : 26 déc. 2013, 14:02
par Jacques2014
sirakawa,

J'ai fais comme tu as dis même remplacé "LIKE" par " = ",

Mais c'est pareil ! Si un titre à 10 spécificités il apparait 10 fois ?

Alors j'ai ajouté un nouveau critère : Que "Guitare" soit présent.

Cela à l'air de fonctionner !? Car alors il y a moins de résultats :o)

J'ai ajouté un second critère : Que "Batterie" soit présent...
SELECT *
                       
FROM titre AS a
INNER JOIN specs AS b ON ( a.id_tit= b.id_tit)
WHERE (
(a.pays LIKE '10' )
AND (b.specs_id LIKE '29')  // ID 29 est guitare
AND (b.specs_id LIKE '70')  // ID 70 est Batterie 
);
Mais la aucun résultat ? C'est écrit en vert : "MySQL n'a retourné aucun enregistrement. " ?
Je ne comprend pas ?
Jacques

Re: Requête MySQL

Posté : 26 déc. 2013, 14:06
par Jacques2014
Précisions :
Alors qu'il y a bien des titres avec "guitare" et "batterie" dans le pays recherché.
Et j'ai remplacé tous les "LIKE" par des " = " !

Re: Requête MySQL

Posté : 26 déc. 2013, 15:26
par noobinoob
en effet aucune réponse car b.specs_id ne peut pas valoir des valeurs différentes en même temps

essaie :
SELECT *
FROM
   titre AS a
   INNER JOIN specs AS b
ON (
   a.id_tit = b.id_tit
)
WHERE (
   (a.pays = '10' )
   AND (
      (b.specs_id = '29') 
      OR (b.specs_id = '70')
   )
);

Re: Requête MySQL

Posté : 26 déc. 2013, 15:31
par noobinoob
et je suppose qu'on peut aussi faire :

monchamp in (liste de valeurs)

ici : b.specs_id in ('29', '70')

Re: Requête MySQL

Posté : 26 déc. 2013, 15:45
par Jacques2014
Merci noobinoob de ta réponse,

C'est donc cela, un champ ne avoir plusieurs valeurs.

J'ai bien essayé avec " OR " Mais ce n'est pas l'effet recherché.

Je vais essayer avec : "b.specs_id in ('29', '70')" et vous dire

Merci

Jacques

Re: Requête MySQL

Posté : 26 déc. 2013, 15:54
par Jacques2014
noobinoob
Comment utiliser : "b.specs_id in ('29', '70')" ?
Je ne l'ai vu nulle part ?

Merci
Jacques

Re: Requête MySQL

Posté : 26 déc. 2013, 19:45
par Jacques2014
ooops ! :o)
J'ai trouvé le "IN" :

WHERE    b.specs_id IN (29, 70, 38)

Mais cela ne semble pas fonctionner non plus ?
Je vais essayer avec un GROUP BY !?

Merci

Jacques

Re: Requête MySQL

Posté : 26 déc. 2013, 19:52
par Jacques2014
A y est ! :-)

Je pense avoir trouvé... grâce à vous ! :-)

Il fallait faire : (je vais quand même faire des tests..)
SELECT * FROM titres AS a
INNER JOIN specs AS b ON ( a.id_tit = b.id_tit )
WHERE (a.pays LIKE '10')
AND ( b.specs_id IN ('29', '70', '38'))
GROUP BY  a.id_ch
Le "GROUP BY" semble éviter que le titre apparaisse 10 fois si il y a 10 spécificités.

Merci
Bonnes fêtes à vous tous
Jacques