par
Victor BRITO » 01 févr. 2007, 14:36
Salut à tous!
Pour un site pro en cours de refonte, je mets au point un formulaire de recherche qui consiste à chercher un ou plusieurs mots dans la base de données. Jusqu'ici, rien à signaler.
La base de données comporte plusieurs tables, dont une listant les différents menus, une autre les rubriques contenues dans les menus et une troisième les fiches contenues dans les rubriques. Des clés primaires et des clés d'index sont présentes pour le jonglage entre tables. Et ce, pour avoir un fil d'ariane du genre Prêt-à-porter (menus) > Lingerie (rubriques) > Nom d'une enseigne (fiches).
Dans la base de données, on enregistre une rubrique "Lingerie féminine", une rubrique "Lingerie masculine" (rubriques attachées au menu "Prêt-à-porter") et cinq fiches, dont quatre sont attachées à la rubrique "Lingerie féminine" (parmi ces quatre, une a un nom comportant le mot "lingerie") et une à la rubrique "Lingerie masculine".
On obtient donc les données suivantes:
Code : Tout sélectionner
Table rubriques
+----+---------+--------------------+--------------------+
| id | id_menu | nom | url |
+----+---------+--------------------+--------------------+
| 1 | 15 | Lingerie masculine | lingerie-masculine |
| 2 | 15 | Lingerie féminine | lingerie-feminine |
+----+---------+--------------------+--------------------+
Table fiches
+----+-------------+---------------------+-------------------+-------------------+
| id | id_rubrique | description_resume | nom | url |
+----+-------------+---------------------+-------------------+-------------------+
| 82 | 1 | Description rapide. | Majoss | majoss |
| 85 | 2 | Description rapide. | Julie A Lingerie | julie-a-lingerie |
| 86 | 2 | Description rapide. | Lolie Belle | lolie-belle |
| 87 | 2 | Description rapide. | Des Voiles et Moi | des-voiles-et-moi |
| 88 | 2 | Description rapide. | Collants.fr | collants.fr |
+----+-------------+---------------------+-------------------+-------------------+
On cherche le mot "lingerie".
Lorsqu'on effectue la requête suivante:
Code : Tout sélectionner
SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND fiches.nom LIKE '%Lingerie%'
un seul résultat est retourné (logique).
Même logique (5 résultats retournés) avec cette requête-ci:
Code : Tout sélectionner
SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND rubriques.nom LIKE '%Lingerie%'
En revanche, si l'on effectue cette requête:
Code : Tout sélectionner
SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND fiches.nom
OR rubriques.nom LIKE '%Lingerie%'
un nombre astronomique de résultats est retourné.
Et si on ajoute des parenthèses comme suit:
aucun résultat n'est retourné (alors qu'on s'attend au contraire).
Serait-il impossible d'appliquer la commande de contrôle LIKE à plusieurs colonnes réparties sur plusieurs tables à la fois?

Salut à tous!
Pour un site pro en cours de refonte, je mets au point un formulaire de recherche qui consiste à chercher un ou plusieurs mots dans la base de données. Jusqu'ici, rien à signaler.
La base de données comporte plusieurs tables, dont une listant les différents menus, une autre les rubriques contenues dans les menus et une troisième les fiches contenues dans les rubriques. Des clés primaires et des clés d'index sont présentes pour le jonglage entre tables. Et ce, pour avoir un fil d'ariane du genre Prêt-à-porter (menus) > Lingerie (rubriques) > Nom d'une enseigne (fiches).
Dans la base de données, on enregistre une rubrique "Lingerie féminine", une rubrique "Lingerie masculine" (rubriques attachées au menu "Prêt-à-porter") et cinq fiches, dont quatre sont attachées à la rubrique "Lingerie féminine" (parmi ces quatre, une a un nom comportant le mot "lingerie") et une à la rubrique "Lingerie masculine".
On obtient donc les données suivantes:
[code]
Table rubriques
+----+---------+--------------------+--------------------+
| id | id_menu | nom | url |
+----+---------+--------------------+--------------------+
| 1 | 15 | Lingerie masculine | lingerie-masculine |
| 2 | 15 | Lingerie féminine | lingerie-feminine |
+----+---------+--------------------+--------------------+
Table fiches
+----+-------------+---------------------+-------------------+-------------------+
| id | id_rubrique | description_resume | nom | url |
+----+-------------+---------------------+-------------------+-------------------+
| 82 | 1 | Description rapide. | Majoss | majoss |
| 85 | 2 | Description rapide. | Julie A Lingerie | julie-a-lingerie |
| 86 | 2 | Description rapide. | Lolie Belle | lolie-belle |
| 87 | 2 | Description rapide. | Des Voiles et Moi | des-voiles-et-moi |
| 88 | 2 | Description rapide. | Collants.fr | collants.fr |
+----+-------------+---------------------+-------------------+-------------------+[/code]
On cherche le mot "lingerie".
Lorsqu'on effectue la requête suivante:
[code]SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND fiches.nom LIKE '%Lingerie%'[/code]
un seul résultat est retourné (logique).
Même logique (5 résultats retournés) avec cette requête-ci:
[code]SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND rubriques.nom LIKE '%Lingerie%'[/code]
En revanche, si l'on effectue cette requête:
[code]SELECT
fiches.description_resume AS description_resume,
fiches.nom AS fiches_nom,
fiches.url AS fiches_url,
rubriques.nom AS rubriques_nom,
rubriques.url AS rubriques_url,
menus.nom AS menus_nom,
menus.url AS menus_url
FROM fiches, rubriques, menus
WHERE
id_rubrique=rubriques.id
AND
id_menu=menus.id
AND fiches.nom
OR rubriques.nom LIKE '%Lingerie%'[/code]
un nombre astronomique de résultats est retourné.
Et si on ajoute des parenthèses comme suit:
[code]AND (fiches.nom
OR rubriques.nom) LIKE '%Lingerie%'[/code]
aucun résultat n'est retourné (alors qu'on s'attend au contraire).
Serait-il impossible d'appliquer la commande de contrôle LIKE à plusieurs colonnes réparties sur plusieurs tables à la fois? :oops: