Aller au contenu

Requete sur plusieurs tables


furious Gontran

Sujets conseillés

Conseil pour trouver le pb :

1) Tu prends un outil d'administration de bdd quelconque (phpMyAdmin, Sql Yog ...)

2) Tu tapes ta requète dedans et tu regardes ce qui sort

3) Tu réduis ta requète à une version ultra-top simplifiée (aucun where au départ), puis tu la rallonges petit à petit jusqu'à trouver où ça fait tilt

Lien vers le commentaire
Partager sur d’autres sites

En fait c'etait un truc tout con ma table zoom etait vide....

Merci pour cette info... parce que même en cherchant bien on ne voyait pas où se trouvait l'erreur :lol:
Lien vers le commentaire
Partager sur d’autres sites

:blush:

Vi, excuse je m'en suis apercu que ce matin moi meme....

J'ais donc remplis cette table avec test pour tous les champs.

Hé ben ca merdouille encore.

Voici la requete:

SELECT * FROM chroniques, traverse, zoom WHERE chroniques.Titre LIKE '%noir%' OR chroniques.Resume LIKE '%noir%' OR zoom.Titre LIKE '%noir%' OR zoom.Resume LIKE '%noir%' OR traverse.Titre LIKE '%noir%' OR traverse.Resume LIKE '%noir%' LIMIT 0,20

La ca me sors tout le contenu de la table chroniques, alors qu'il n'y a qu'un article de la table traverse dont le titre contient le mot noir.

Par contre si je cherche un mot se trouvant dans la table chroniques il me sors juste l'article le contenant...

La recherche sur une seule table marche tres bien.

SELECT * FROM chroniques, traverse, zoom WHERE 1 AND ( (chroniques.Titre LIKE '%batman%') OR (chroniques.Resume LIKE '%batman%') ) AND ( (zoom.Titre LIKE '%batman%') OR (zoom.Resume LIKE '%batman%') ) AND ( (traverse.Titre LIKE '%batman%') OR (traverse.Resume LIKE '%batman%') ) LIMIT 0,20

Ne me sors rien alors qu'un article de chroniques contient le mot...

Si j'execute cette requete sous php my admin c'est la meme a la difference qu'il me sors toutes les valeurs de toutes les tables...

Mon champ resume est vide partout.

Est ce de la que viens le probleme ??

Ca serais bizarre rien n'est pas == a "noir"...

(si c'est le cas comment on fais pour eviter qu'un champ vide bloque tout)

en gros la c'est un peu gonflant on dirais qu'il n'effestue bien la recherche que sur la premiere table de la liste.

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

Cherches à comprendre ta requète.

Ne places pas les AND n'importe où, sinon tu restreins la requète.

Là, tu as peut etre trop mis de AND, ou pas assez de parenthèses.

Pour éviter qu'un champ soit vide lors de la requète, mets un test :

if(!empty($word))$WHERE ?= REQUETE etc..

Lien vers le commentaire
Partager sur d’autres sites

Salut Furious Gontran,

Tes tables sont grosses ? Pourrais-tu poster un export de ces 3 tables ?

Histoire de pouvoir tester en local ce que cela donne :)

Dan

Lien vers le commentaire
Partager sur d’autres sites

SELECT * FROM chroniques, traverse, zoom WHERE 1 AND ( (chroniques.Titre LIKE '%batman%') OR (chroniques.Resume LIKE '%batman%') ) AND ( (zoom.Titre LIKE '%batman%') OR (zoom.Resume LIKE '%batman%') ) AND ( (traverse.Titre LIKE '%batman%') OR (traverse.Resume LIKE '%batman%') ) LIMIT 0,20

En fait tu cherches à sélectionner dans les tables chroniques, traverse et zoom les entrées qui:

contiennent 'batman' dans le titre ou le resume de la table 'chroniques'

ET

contiennent 'batman' dans le titre ou le resume de la table 'zoom'

ET

contiennent 'batman' dans le titre ou le resume de la table 'traverse'

Cela me semble pour le moins ambigu et irréaliste. ;)

Les recherches multi-tables sans "JOIN" (inner, right ou left) comprennent un "INNER JOIN" implicite matérialisé par la virgule. C'est à dire la matrice de toutes les entrées de toutes les tables. :o

INNER JOIN et , (virgule) sont sémantiquement équivalents. Les deux opèrent une jointure totale sur les tables utilisées. Normalement, vous spécifiez les conditions de jointure dans la clause WHERE.

La page sur mysql.com: http://dev.mysql.com/doc/mysql/fr/JOIN.html

Lien vers le commentaire
Partager sur d’autres sites

_AT_Anonymous

Pour l'erreur avec le AND je viens de comprendre.

Mais le probleme viensde celle avec OR, je comprend ma requete et c'est bien l'action que je veux effectuer sur ma base:

selectionne tous en provenance de chroniques, traverse, zoom où le titre de chronique ressemble a Noir ou bien le resume de chronique ressemble a noir ou bien le titre de traverse ressemble a noir....etc

Le truc c'est que ma requete avec les OR ne marche pas plus...

_AT_Dan

Mes tables contiennent:

8entrees

2entrees

1entree

que veux tu que je t'envois et ou ?

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...