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!)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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!)
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
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!)
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
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!)
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
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
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
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
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
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