Probleme de requete

Eléphanteau du PHP | 14 Messages

12 nov. 2010, 16:45

Bonjour,
j'ai un problème je cherche à faire une requête de recherche mais malheureusement j'obtiens une erreur du type #1066 - Not unique table/alias: 'ouvrage' Je m'en remet à vous : Comment modifier ma requête pour que celle-ci fonctionne :
SELECT ouv_id, ouv_titre, ouv_photoLien, ouv_resume, ouv_annee, ouv_volume, ouv_page, the_libelle, edi_libelle, typ_libelle
FROM ouvrage
INNER JOIN thematique ON ( ouv_the_id = the_id )
LEFT JOIN editeur ON ( ouv_edi_id = edi_id )
INNER JOIN TYPE ON ( ouv_typ_id = typ_id ) , ecrire
INNER JOIN ouvrage ON ( ecr_ouv_id = ouv_id )
INNER JOIN auteur ON ( ecr_aut_id = aut_id )
WHERE ouv_titre LIKE "%Prendre%"
OR ouv_resume LIKE "%Prendre%"
OR ouv_annee LIKE "%Prendre%"
OR ouv_volume LIKE "%Prendre%"
OR ouv_page LIKE "%Prendre%"
OR the_libelle LIKE "%Prendre%"
OR edi_libelle LIKE "%Prendre%"
OR typ_libelle LIKE "%Prendre%"
OR aut_nom LIKE "%Prendre%"
OR aut_prenom LIKE "%Prendre%"
OR aut_displayName LIKE "%Prendre%"

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 nov. 2010, 18:07

Tu as deux fois la table "ouvrage" dans ta requête, donc soit tu la supprimes si c'est inutile, soit tu mets deux alias différent si tu as vraiment besoin de la citer deux fois.

D'ailleurs c'est bien de mettre systématiquement des alias, comme ça on sait quelle colonne vient de quelle table, exemple:
SELECT ouv_id, ouv_titre, ouv_photoLien, ouv_resume, ouv_annee, ouv_volume, ouv_page, the_libelle, edi_libelle, typ_libelle
FROM ouvrage o 
INNER JOIN thematique t ON ( o.ouv_the_id = t.the_id )

ViPHP
ViPHP | 5462 Messages

13 nov. 2010, 05:09

Et si t'es en MyIsam pour tes tables utilise le fulltext sur ta requete au lieu des likes, ou concatène tes champs a la place de faire un multiple LIKE

ViPHP
AB
ViPHP | 5818 Messages

13 nov. 2010, 19:05

Et si t'es en MyIsam pour tes tables utilise le fulltext sur ta requete au lieu des likes, ou concatène tes champs a la place de faire un multiple LIKE
Avec fulltext, outre le fait de devoir travailler avec des tables MyIsam, il y a aussi la restriction sur le nombre minimum de caractères à rentrer =4 pour pouvoir faire la recherche. Ce nombre est modifiable mais certainement pas sur des serveurs mutualisés.

C'était juste une précision à savoir avant de choisir la méthode de recherche :)

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 12:26

Bonjour, merci pour ces réponses j'en suis donc venu à faire (après avoir testé les 2 méthodes) :
SELECT DISTINCT o1.ouv_id, o1.ouv_titre, o1.ouv_photoLien, o1.ouv_resume, o1.ouv_annee, o1.ouv_volume, o1.ouv_page, the_libelle, edi_libelle, typ_libelle
FROM ouvrage AS o1
INNER JOIN thematique ON ( o1.ouv_the_id = the_id )
LEFT JOIN editeur ON ( o1.ouv_edi_id = edi_id )
INNER JOIN TYPE ON ( o1.ouv_typ_id = typ_id ) , ecrire
INNER JOIN ouvrage o2 ON ( ecr_ouv_id = o2.ouv_id )
INNER JOIN auteur ON ( ecr_aut_id = aut_id )
WHERE CONCAT( o1.ouv_titre, o1.ouv_resume, o1.ouv_annee, the_libelle, edi_libelle, typ_libelle, aut_nom, aut_prenom, aut_displayName ) LIKE (
"%FOUCAUD%"
)
Mais bizarrement cette requête me renvoie deux résultats, alors que je n'ai qu'un seul auteur du nom de foucaud et que cet auteur n'a écrit en réalité que un article.

MLDR : ouvrage(ouv_id,ouv_titre...., ouv_the_id#,ouv_edi_id#,ouv_typ_id#)
ecrire(ecr_ouv_id#,ecr_aut_id#)
auteur(aut_id,aut_nom....)
type(typ_id,typ_libelle) ...

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 12:28

t'as essaye dans phpmyadmin ta requête ?

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 12:52

oui (c'est là ou je fais mes tests ).

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 12:53

oui (c'est là ou je fais mes tests ).
regarde pourquoi les ligne sont doubler tu dois avec un des JOIN ou y'a plusieurs résultat

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 13:21

Je ne comprends pas ta réponse...
Mais si je fais :
SELECT DISTINCT o1.ouv_id, o1.ouv_titre, o1.ouv_photoLien, o1.ouv_resume, o1.ouv_annee, o1.ouv_volume, o1.ouv_page, the_libelle, edi_libelle, typ_libelle
FROM ouvrage AS o1
INNER JOIN thematique ON ( o1.ouv_the_id = the_id )
LEFT JOIN editeur ON ( o1.ouv_edi_id = edi_id )
INNER JOIN TYPE ON ( o1.ouv_typ_id = typ_id ) , ecrire
INNER JOIN ouvrage o2 ON ( ecr_ouv_id = o2.ouv_id )
INNER JOIN auteur ON ( ecr_aut_id = aut_id )
j'obtiens bien mes 3 articles.
Néanmoins si je fais
SELECT DISTINCT o1.ouv_id, o1.ouv_titre, o1.ouv_photoLien, o1.ouv_resume, o1.ouv_annee, o1.ouv_volume, o1.ouv_page, the_libelle, edi_libelle, typ_libelle
FROM ouvrage AS o1
INNER JOIN thematique ON ( o1.ouv_the_id = the_id )
LEFT JOIN editeur ON ( o1.ouv_edi_id = edi_id )
INNER JOIN TYPE ON ( o1.ouv_typ_id = typ_id ) , ecrire
INNER JOIN ouvrage o2 ON ( ecr_ouv_id = o2.ouv_id )
INNER JOIN auteur ON ( ecr_aut_id = aut_id )
WHERE CONCAT( o1.ouv_titre, o1.ouv_resume, o1.ouv_annee, the_libelle, edi_libelle, typ_libelle, aut_nom, aut_prenom, aut_displayName ) LIKE (
"%%"
)
j'en obtiens que deux, ça m'angoisse (les mêmes que j'obtiens quand mon keyword vaut "FOUCAUD") ...

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 13:23

Par contre je suis sûr que si ça ne marche pas , c'est à cause de la table association "ecrire" qui relie des auteurs avec un ouvrage...

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 13:42

Cette version :
SELECT DISTINCT o2.ouv_id, o2.ouv_titre, o2.ouv_photoLien, o2.ouv_resume, o2.ouv_annee, o2.ouv_volume, o2.ouv_page, the_libelle, edi_libelle, typ_libelle FROM ouvrage AS o1 INNER JOIN thematique ON ( o2.ouv_the_id = the_id ) LEFT JOIN editeur ON ( o2.ouv_edi_id = edi_id ) INNER JOIN TYPE ON ( o2.ouv_typ_id = typ_id ), ecrire INNER JOIN ouvrage o2 ON ( ecr_ouv_id = o2.ouv_id ) INNER JOIN auteur ON ( ecr_aut_id = aut_id )WHERE CONCAT( o2.ouv_titre, o2.ouv_resume, o2.ouv_annee, the_libelle, edi_libelle, typ_libelle, aut_nom, aut_prenom, aut_displayName ) LIKE ( "%Dominique%");
Fait bien la recherche sur l'auteur mais elle m'exclue systématiquement l'ouvrage numéro 2 qui n'a pas d'editeur pourtant j'ai bien LEFT JOIN editeur ON ( o2.ouv_edi_id = edi_id )

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 14:41

Trouvée ! en séparant l'éditeur du where
SELECT DISTINCT o2.ouv_id, o2.ouv_titre, o2.ouv_photoLien, o2.ouv_resume, o2.ouv_annee, o2.ouv_volume, o2.ouv_page, the_libelle, edi_libelle, typ_libelle FROM ouvrage AS o1 INNER JOIN thematique ON ( o2.ouv_the_id = the_id ) LEFT JOIN editeur ON ( o2.ouv_edi_id = edi_id ) INNER JOIN TYPE ON ( o2.ouv_typ_id = typ_id ), ecrire INNER JOIN ouvrage o2 ON ( ecr_ouv_id = o2.ouv_id ) INNER JOIN auteur ON ( ecr_aut_id = aut_id ) WHERE CONCAT( o2.ouv_titre, o2.ouv_resume, o2.ouv_annee, the_libelle,typ_libelle, aut_nom, aut_prenom, aut_displayName ) LIKE ( "%Dominique%") OR edi_libelle LIKE ("%Dominique%")
Cette requête me renvoie exactement ce que je veux.

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 14:46

cool, par contre pour le CONCAT je te conseil plutôt CONCAT_WS avec un séparateur genre tilde ~
imagine que tu cherches "machin" et que t'a un champs avec emmaet un autre avec chine, tu va avoir emmachine, alors que y'a pas machine si tu met un séparateur tu va avoir emma~chine :wink:

Eléphanteau du PHP | 14 Messages

15 nov. 2010, 16:43

ok merci beaucoup.