Aller au contenu

Sujets conseillés

Posté

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 :wacko:

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 :boude: )

Une idée pour la syntaxe ?

Posté

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, urlSite

FROM 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 :(

Posté (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é par Boumbadaboum
Posté

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.motclef

INNER 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 ^_^

Posté

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. :P

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?

Posté

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 :)

Posté

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

Posté

Nan dans la table définition tu as le champs motclef donc dans le where mets :

WHERE definitions.motclef like '$lettre%'

Posté

Et tu as l'erreur "Unknown column 'definitions' in 'where clause'" ou Unknown column 'motclef' in 'where clause' ?

Posté

ç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.urlSite
FROM 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.

Posté

Ca n'est pas posible, tu as dû faire une erreur....

Sinon, enlève le where pour voir si la requete fonctionne sans.

Posté (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é par Boumbadaboum
Posté

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 ^_^

Posté

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.

Posté (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é par Boumbadaboum
Posté

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.urlSite

FROM        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 Expr1

FROM        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 :(

Posté

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)

Posté

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

:fou:

Veuillez vous connecter pour commenter

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



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