Boumbadaboum Posté 10 Août 2005 Posté 10 Août 2005 Bonjour à tous, J'ai acheté un bon bouquin SQL suivant les conseils de Dan ( ), mais là la requête est vraiment trop balaise pour moi, j'ai besoin d'un peu d'aide SVP : Voila la requête actuelle: $Lettre="SELECT MotClef, libelle,site, urlSite, nbrLiens, nbrComplement FROM definitions WHERE MotClef like '$lettre%' ORDER BY MotClef" Cette requête fonctionne. La question concerne 'nbrLiens' et 'nbrComplement'. Ces deux champs sont incrémentés chaque fois qu'un nouveau lien ou un nouveau complément est proposé pour la lettre. ça fonctionne, mais si j'en supprime un, bien sur le champ ne se décrémente pas, c'est nul. La solution pour nbrLiens par exemple: Effectuer une jointure naturelle (si je ne m'abuse) qui compte le nombre de liens dans la table ' Liens'ayant le même motClef. Mais je dois tout récupérer en une seule requête pour placer cela dans un même tableau ! Alors c'est balaise un truc du genre $Lettre="SELECT MotClef, libelle,site, urlSite FROM definitions WHERE MotClef like '$lettre%' ORDER BY MotClef" (COUNT liens.libelle,complements.libelle FROM liens,complement WHERE motclef Like definitions.motclef ) (on ne se moque pas de ma tentative de requête ) Une idée pour la syntaxe ?
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Bon encore une fois j'ai pas tout capté mais tu peux esayer ca : select count(liens.libelle) as liens_libelle, count(complements.libelle) as comp_libelle, MotClef, libelle,site, urlSiteFROM definitions INNER JOIN liens on definitions.motclef = liens.motclef INNER JOIN complements ON definitions.motclef = complements .motclef WHERE definitions like '$lettre%' GROUP BY MotClef, libelle,site, urlSite Pas sûr que ca marche car j'ai pas mysql au taf
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 (modifié) Déjà merci pour ta réponse Portekoi ! Mais avant que je n'essaye cette requête dantesque quelqu'un pourrait-il m'aider à la traduire en bon français? Parce que vu qu'elle ne va surement pas fonctionner du premier coups et compte tenu de sa taille, j'aimerais bien savoir ce que je fais ne serais ce que pour pouvoir ensuite poser les questions adéquates où pour chercher aux bons endroits dans mon livre sql. Modifié 10 Août 2005 par Boumbadaboum
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Sql et Moi select count(liens.libelle) as liens_libelle, count(complements.libelle) as comp_libelle, MotClef, libelle,site, urlSite Ecoute moi bien SQL, tu vas me chercher : 1 - Le nombre de libelle de la table liens 2 - Le nombre de libelle de la table complements 3 - Le champ 'Motclef' 4 - le champ 'libelle' 5 - le champ 'site' 6 - le champ 'urlsite' FROM definitions INNER JOIN liens on definitions.motclef = liens.motclefINNER JOIN complements ON definitions.motclef = complements .motclef Oui mais je ne sais pas où aller Et bien tu vas aller : Dans la table definitions dont la colonne 'motclef' est égale à la colonne 'motclef' de la table liens ainsi qu'avec la colonne 'motclef' de la table complements WHERE definitions like '$lettre%' Oui mais lesquels prendre? Et bien tous ceux dont la colonne 'motclef' de la table 'definition' commence par '$lettre' GROUP BY MotClef, libelle,site, urlSite Oui mais je vais avoir plusieurs fois les champs MotClef, libelle,site, urlSite car j'ai plusieurs enregistrements les concernants dans les tables liens et complements Et bien tu les regroupes tous Et c'est ainsi que la requête s'exécuta et eut beaucoup de résultats
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 Bon soyons honnête j'ai fais 10 minutes de yoga avant d'essayer cette fameuse requête. Et je suis pas mécontent du résultat puisque ça fonctionne...pas. Bon soyons sérieux, j'obtiens le message d'erreur : Column: 'MotClef' in field list is ambiguous Mais alors pour un premier essai j'ai recopié la requête telle quelle. Manques pas des doublesquotes, simplesquotes, powerMacQuotes des fois?
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Non rien de tout ca il faut juste préciser quel champ 'motclef' (de quelle en table) Donc pour le SELECT tu dois mettres un truc du style : definitions.MotClef, definitions.libelle,definitions.site, definitions.urlSite A toi de préciser la table et tu mets la même chose dans le GROUP BY donc : definitions.MotClef, definitions.libelle,definitions.site, definitions.urlSite Par contre si tu veux que cela sois le champ 'libelle' de la table complements par exemple, à toi de faire le changement dans les DEUX endroits (Select et Group by) EDIT : Dans le where, j'ai fais une bourde : Remplace : WHERE definitions like '$lettre%' PAR : WHERE definitions.motclef like '$lettre%' Essaie et dis moi
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 alors j'ai un changement, j'obtiens : Unknown column 'definitions' in 'where clause' pour la ligne WHERE definitions like '$lettre%' vraisemblablement. j'ai donc mis WHERE definitions.urlMotClef : idem et WHERE urlMotClef : idem
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Nan dans la table définition tu as le champs motclef donc dans le where mets : WHERE definitions.motclef like '$lettre%'
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 nan c'est ce que j'ai mis j'ai confondu urlMotClef et mot clef mais j'ai bien mis definitions.motClef
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Et tu as l'erreur "Unknown column 'definitions' in 'where clause'" ou Unknown column 'motclef' in 'where clause' ?
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 "Unknown column 'definitions' in 'where clause'"
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 ça c'est ma requête : $Lettre="SELECT COUNT(annuaire.MotClef) as annuaire_MotClef, COUNT(complements.MotClef) as comp_MotClef, definitions.MotClef, definitions.libelle,definitions.nomSite, definitions.urlSiteFROM definitions INNER JOIN annuaire on definitions.MotClef = annuaire.MotClef INNER JOIN complements ON definitions.MotClef = complements.MotClef WHERE definitions.MotClef like '$lettre%'GROUP BY definitions.MotClef, definitions.libelle,definitions.nomSite, definitions.urlSite" et j'obtiens donc : Unknown column 'definitions' in 'where clause' Le but étant donc de compter le nombre de liens dans la table 'annuaire' et le nombre de complément dans la table 'complement' où le motClef est le même que dans la table 'definitions'. Costaud hein ? Où c'est moi qui suis nul peut être mais bon.
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Ca n'est pas posible, tu as dû faire une erreur.... Sinon, enlève le where pour voir si la requete fonctionne sans.
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 (modifié) ça donne pas grand chose : il ne me donne qu'un seul résultat, sur toute la liste, et il me sort le contenu de l'ex champs nbrComplement de la table définitions (celui à remplacer par la requête donc). ça ne va pas chercher le total des compléments ayant le même motClef Modifié 10 Août 2005 par Boumbadaboum
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Essaie ca : SELECT COUNT(annuaire.MotClef) AS annuaire_MotClef, COUNT(complements.MotClef) AS comp_MotClef, definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite FROM definitions LEFT OUTER JOIN annuaire ON definitions.MotClef = annuaire.MotClef LEFT OUTER JOIN complements ON definitions.MotClef = complements.MotClef WHERE (definitions.MotClef LIKE 'a%') GROUP BY definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite Ca marche sur mon SQL Server. Donc cela doit marcher sur Mysql car c'est du SQL de base. Je t'expliquerais après le OUTER JOIN
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 Terrifiant ça à l'air de fonctionner !!!! Je vais faire quelque test, ça doit bien foirer quelque part, je reviens vous dire ça dans 15 mn
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 Bah ça fonctionne... presque lol ! (ahhh tester, retester, tout un métier ! ) Voilà ce qui se passe : Admettons que pour la définition A j'ai 0 liens et je valide un complément. Cela m'affiche 0 liens et 1 complément : C'est bon. Admettons que pour la définition A j'ai 5 liens et je valide un complément. Cela m'affiche 5 liens et 5 compléments : C'est plus bon.
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Arf c'est normal.. c'est à cause des outer join Je cherche une solution.....
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 (modifié) Déjà merci beaucoup de l'attention que tu m'accordes Portekoi ! (Tiens sur ta page http://kit.portekoi.com/ tu as une faute d'ortographe à "Il s'agirat d\'un CMS ( Systeme de gestion de..." Je te le dis comme ça, c'est pas très charismatique pour les clients Modifié 10 Août 2005 par Boumbadaboum
Portekoi Posté 10 Août 2005 Posté 10 Août 2005 Bon bé... sous SQL Server, je peux imbriquer mes requete comme ceci mais cela ne fonctionne pas sous MYSQL SELECT COUNT(annuaire.MotClef) AS Expr2, DERIVEDTBL.comp_MotClef, DERIVEDTBL.MotClef AS Expr1, DERIVEDTBL.libelle, DERIVEDTBL.nomSite, DERIVEDTBL.urlSite FROM (SELECT COUNT(complements.MotClef) AS comp_MotClef, definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite FROM definitions LEFT OUTER JOIN complements ON definitions.MotClef = complements.MotClef GROUP BY definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite) DERIVEDTBL LEFT OUTER JOIN annuaire ON DERIVEDTBL.MotClef COLLATE French_CI_AS = annuaire.MotClef GROUP BY DERIVEDTBL.comp_MotClef, DERIVEDTBL.MotClef, DERIVEDTBL.libelle, DERIVEDTBL.nomSite, DERIVEDTBL.urlSite Je pense que tu vas devoir le faire en 2 requetes du type : SELECT COUNT(complements.MotClef) AS comp_MotClef, definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSiteFROM complements RIGHT OUTER JOIN definitions ON complements.MotClef = definitions.MotClef GROUP BY definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite et SELECT definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite, COUNT(annuaire.MotClef) AS Expr1FROM definitions LEFT OUTER JOIN annuaire ON definitions.MotClef = annuaire.MotClef GROUP BY definitions.MotClef, definitions.libelle, definitions.nomSite, definitions.urlSite Désolé mais je ne pratique pas assez MYSQL pour t'aider
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 Ok merci d'avoir essayé ! Bon alors un truc BEAUCOUP plus simple, qui va me dépanner qd même : J'ai la requête suivante : $modifComp="UPDATE `definitions` set nbrComplement = nbrComplement+1 WHERE `urlMotClef` like '$urlMotClef%'"; Le problème de cette requête c'est que si j'ai par exemple un tuple 'accord' et un tuple 'accorder(')' alors elle m'incrémente les deux tuples. j'ai essayé d'ajouter un LIMIT 0,1 mais ça ne fonctionne pas (même pas de message d'erreur)
Boumbadaboum Posté 10 Août 2005 Auteur Posté 10 Août 2005 Et pourquoi quand je dis WHERE id =$id j'obtiens exactement le chiffre, alors que si je dis WHERE libelle =$libelle je n'obtiens rien du tout? Je suis obligé d'utiliser like qui me renvois des doublons. Où alors je met un LIMIT 0,1 mais alors ça ne marche plus avec UPDATE
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant