OVH Cloud OVH Cloud

Probleme de SELECT

3 réponses
Avatar
Alain Chappuis
Bonjour,
je sèche sur un petit problème de recherche dans deux tables.

J'ai une table périodique puis une autre table bibliothèque.

Je dois sortir tous les titres selon une clé fournie par l'utilisateur
sur le titre de la table périodique. Mais je dois sélectionner la
bibliothèque qui contient le titre.
Voici mon select:

$vAction = "SELECT * FROM $vTperiodiques AS P INNER JOIN $vTbibliotheque AS B
WHERE ((P.Ch1 LIKE '%$v_cle1%$v_cle2%') AND (B.sigle=\"%GE 8\")) ORDER BY P.Ch1
ASC";

Cela ne trouve rien. J'ai peut-être pas encore compris les jointures
ou comment rechercher dans deux tables sur des champs différents...

Merci pour votre aide.

Ps: je ne suis pas un étudiant! (voir autres discussions dans ce forum)

Alain
--
Alain Chappuis (Remove: pouriel to answer me in my address!)
(Enlevez: pouriel de mon adresse pour me répondre!)

3 réponses

Avatar
Alain Chappuis
Antoun a écrit :

J'ai une table périodique puis une autre table bibliothèque.

Je dois sortir tous les titres selon une clé fournie par l'utilisateur
sur le titre de la table périodique. Mais je dois sélectionner la
bibliothèque qui contient le titre.
Voici mon select:

$vAction = "SELECT * FROM $vTperiodiques AS P INNER JOIN
$vTbibliotheque AS B




il ne te manquerait pas un truc du genre :
ON P.IDbibli = B.IDbibli

(je suppose que chaque pério appartient à une et une seule bibli

> WHERE ((P.Ch1 LIKE '%$v_cle1%$v_cle2%') AND (B.sigle="%GE 8"))

B.sigle LIKE "%GE 8"
marchera bcp mieux. En effet, % n'est un joker que s'il est utilisé avec
LIKE. Avec =, ça n'est jamais que le signe %, ce qui explique que ta
requête ne trouve rien.

Tu peux également simplifier (et normaliser) ton écriture en remplaçant
les guillemets par des apostrophes et en virant les parenthèses inutiles:

WHERE P.Ch1 LIKE '%$v_cle1%$v_cle2%' AND B.sigle='%GE 8'



Voici ce que j'ai fait dans phpMyAdmin:

SELECT *

FROM Periodiques AS P INNER JOIN Bibliotheque AS B
WHERE P.Ch1 LIKE '%JOURNAL%' AND B.sigle='%GE 8'

aucun résultat!

autres variantes:

SELECT *
FROM Periodiques AS P
INNER JOIN Bibliotheque AS B
WHERE P.Ch1 LIKE "%JOURNAL%"
AND B.sigle = "%GE 8"
LIMIT 0 , 30

Aucun résultat.

SELECT *
FROM Periodiques AS P
INNER JOIN Bibliotheque AS B
WHERE P.Ch1 LIKE "%JOURNAL%"
AND B.sigle LIKE "%GE 8"
LIMIT 0 , 30

Aucun résultat.

SELECT *
FROM Periodiques AS P INNER JOIN Bibliotheque AS B
WHERE (P.Ch1 LIKE "%JOURNAL%") AND (B.sigle LIKE "%GE 8%")

Boucle infinie!
-----------------------------
Si je décompose:

SELECT *
FROM Bibliotheque AS B
WHERE (
B.sigle LIKE "%GE 8%"
)
LIMIT 0 , 30

Affichage des enregistrements 0 - 29 (5 822 total, traitement: 0.0045 sec.)

et:

SELECT *
FROM Periodiques AS P
WHERE (
P.Ch1 LIKE "%JOURNAL%"
)
LIMIT 0 , 30

Affichage des enregistrements 0 - 29 (2 184 total, traitement: 0.0054 sec.)

Comment résoudre mon problème avec une recherche sur différents champs qui
n'ont pas d'équivalence ID, mais uniquement dans le contenu des champs.

Merci par avance pour vos réponses.

Ps: Il est bien clair que je peux faire ces recherches en deux temps
avec le code PHP, mais j'aurai aimé comprendre l'utilité de placer ça
dans une commande SQL.

Alain.
--
Alain Chappuis (Remove: pouriel to answer me in my address!)
(Enlevez: pouriel de mon adresse pour me répondre!)
Avatar
Antoun
Alain Chappuis wrote:
Antoun a écrit :


Voici ce que j'ai fait dans phpMyAdmin:


(...)
autres variantes:


(...)

en d'autres termes, quand tu utilises = au lieu de LIKE, tu n'obtiens
rien, ce qui est logique puisqu'aucun de tes noms ne contient de %.

Quand tu utilises LIKE, tu as trop d'enregistrements à cause du produit
cartésien...


Ps: Il est bien clair que je peux faire ces recherches en deux temps
avec le code PHP, mais j'aurai aimé comprendre l'utilité de placer ça
dans une commande SQL.



c'est bcp plus rapide de le faire par MySQL. Les jointures sont la base
de l'utilisation d'une BDD, donc prends-le comme un exercice concret ;-)

--
Antoun

Guide complet MySQL 5, par Antoine Dinimant, éd. MicroApplication
http://www.microapp.com/livre_mysql_7873.html
Avatar
Antoun
il ne te manquerait pas un truc du genre :
ON P.IDbibli = B.IDbibli




Heu non, car je gère les (RSI) Record Sequence Indicator pour chaque
table.



Kékséksa ???

Dans tous les cas, si tu ne places pas de condition de jointure entre
tes tables Periodiques et Bibliothèques, tu obtiendras un produit
cartésien... dit autrement, si tu as 10 bibliothèques, chaque périodique
apparaîtra 10 fois, une fois par bibli. D'où les nombres
d'enregistrements bcp trop élévés que tu obtiens à chaque fois.

La condition (ou prédicat) de jointure a pour rôle d'indiquer à MySQL
comment il doit mettre en relation un périodique avec une (ou plusieurs)
bibliothèques.


--
Antoun

Guide complet MySQL 5, par Antoine Dinimant, éd. MicroApplication
http://www.microapp.com/livre_mysql_7873.html