IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requete sur une seule table => Group by (+ Expression reguliere ?)


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut Requete sur une seule table => Group by (+ Expression reguliere ?)
    Bonjour,

    Pour être honnête je ne parviens absolument pas à trouver la requete que je cherche car elle dépasse mes connaissances en SQL.

    La requete ne se fait que sur une seule table qui contient l'attribut idsite et urlsite.

    Ainsi j'ai une centaine de ligne de ce genre:

    idsite | urlsite
    -------------------------------------------
    1 | http://www.tenis.com?cat=1
    2 | http://www.tenis.com?cat=4
    3 | http://www.tenis.com?cat=64
    4 | http://www.toto.com?lib=59
    5 | http://www.toto.com?lib=98
    6 | http://www.foot.com?categorie=L1
    7 | http://www.foot.com?categorie=L2
    8 | http://www.rugby.com?class=pro
    etc....
    -------------------------------------------

    Le but de la requête est de m'afficher combien j'ai de lien appartenant à chaque site.

    Ici ca devrait donner:

    http://www.tenis.com => 3
    http://www.toto.com => 2
    http://www.foot.com => 2
    http://www.rugby.com => 1

    Comment procéder ? Ca me dépasse complètement.

    Merci pour votre aide, je reste connecté sur le forum en permanence pour répondre à toutes éventuelles questions.

    Cordialement.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Si tous les liens commencent par "www.unsite.extension?", il devrait être facile, avec les fonctions de chaînes de caractères de MySQL, de grouper par le début de l'url afin de faire un comptage.

    Quelle est la position du point d'interrogation ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LOCATE('?', 'www.tenis.com?cat=1')
    => 14

    Conservons le début de la chaîne jusqu'au point d'interrogation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LEFT('www.tenis.com?cat=1', LOCATE('?', 'www.tenis.com?cat=1') - 1)
    => www.tenis.com

    Au passage : Tennis s'écrit avec 2 n !

    Donc ta requête devrait être la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LEFT(urlsite, LOCATE('?', urlsite) - 1) AS url,
    	COUNT(*) AS nombre
    FROM la_table
    GROUP BY LEFT(urlsite, LOCATE('?', urlsite) - 1)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Heu, mince pour Tennis (personne n'a rien vu...).

    Merci infiniment pour ton aide. Par contre j'ai un petit soucis, ca ne se termine pas forcément par un "?". Il peut y avoir un "/" ou même plusieurs...

    Ce qui est certain c'est que ca se termine par une de ces extensions:
    fr, be, eu, com, net, org, info, biz.

    Comment faire dans ce cas là ?

    La requete que tu m'as donné affiche le résultat avec les URL entières.
    Exemple:
    http://www.foot.com?cat=3324 => 38
    http://www.sport.com?ligue=L1 => 6

    J'aurai aimé:
    http://www.foot.com => 38
    http://www.sport.com => 6


    Après ceci ce sera le top du top

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je commence par la fin de ta réponse...
    ghostfile;6669665]La requete que tu m'as donné affiche le résultat avec les URL entières.
    Exemple:
    http://www.foot.com?cat=3324 => 38
    http://www.sport.com?ligue=L1 => 6

    J'aurai aimé:
    http://www.foot.com => 38
    http://www.sport.com => 6
    Pas logique !
    Ma requête ne sélectionne qu'une partie de l'URL ; comment pourrait-elle donner l'URL entière ?
    Citation Envoyé par CinéPhil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LEFT(urlsite, LOCATE('?', urlsite) - 1) AS url,
    	COUNT(*) AS nombre
    FROM la_table
    GROUP BY LEFT(urlsite, LOCATE('?', urlsite) - 1)
    Citation Envoyé par ghostfile Voir le message
    Par contre j'ai un petit soucis, ca ne se termine pas forcément par un "?". Il peut y avoir un "/" ou même plusieurs...
    Je pense que les deux cas possibles sont :
    - serveur.domaine.extension?parametre
    - serveur.domaine.extension/chemin-vers-page

    On peut alors faire une UNION de deux requêtes et compter le global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT tmp.url, SUM(nombre) AS total
    FROM
    (
    	SELECT LEFT(urlsite, LOCATE('?', urlsite) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	GROUP BY LEFT(urlsite, LOCATE('?', urlsite) - 1)
    	UNION
    	SELECT LEFT(urlsite, LOCATE('/', urlsite) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	GROUP BY LEFT(urlsite, LOCATE('/', urlsite) - 1)
    ) tmp
    GROUP BY tmp.url
    Par contre, si tu as le cas serveur.domaine.extension/chemin-vers-page?parametres tu auras des liens supplémentaires.
    Tu peux alors essayer d'exclure ce cas dans les calculs de la première sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT tmp.url, SUM(nombre) AS total
    FROM
    (
    	SELECT LEFT(urlsite, LOCATE('?', urlsite) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	WHERE urlsite NOT LIKE '%/%'
    	GROUP BY LEFT(urlsite, LOCATE('?', urlsite) - 1)
    	UNION
    	SELECT LEFT(urlsite, LOCATE('/', urlsite) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	GROUP BY LEFT(urlsite, LOCATE('/', urlsite) - 1)
    ) tmp
    GROUP BY tmp.url
    Ce qui est certain c'est que ca se termine par une de ces extensions:
    fr, be, eu, com, net, org, info, biz.
    Je ne pense pas que ce soit utile. Voir ma solution ci-dessus.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci encore.

    Pour répondre à ton message:

    Je pense que le problème est du au fait que toutes mes url commencent par http://
    Du coup ca pose probleme pour rechercher les occurences "/" dans les urls du type: "http://www.site.ext/blabla".

    Une fois le problème ci dessus résolu je pourrai tester ta superbe requete (qui est super longue d'ailleurs ! )
    J'espere qu'avoir enregistré mes urls avec le http ne posera pas de probleme pour cette requete qui m'est très importante.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Et bien si tout commence par http:// il faut commencer la recherche du ? ou du / après le 7ème caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT tmp.url, SUM(nombre) AS total
    FROM
    (
    	SELECT LEFT(urlsite, LOCATE('?', urlsite, 8) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	WHERE urlsite NOT LIKE '%/%'
    	GROUP BY LEFT(urlsite, LOCATE('?', urlsite, 8) - 1)
    	UNION
    	SELECT LEFT(urlsite, LOCATE('/', urlsite, 8) - 1) AS url,
    		COUNT(*) AS nombre
    	FROM la_table
    	GROUP BY LEFT(urlsite, LOCATE('/', urlsite, 8) - 1)
    ) tmp
    GROUP BY tmp.url

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci,

    En executant ta requete j'ai une erreur SQL:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 8) AS url, COUNT(*) AS nombre FROM table WHERE urlsite NO' at line 4

    Une idée ?

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'avais mal placé un 8 en postant la requête la première fois. Je l'ai corrigée sans doute après que tu l'aies copiée.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Un génie... tu es un génie !!

    C'est juste...PARFAIT ! Ton aide m'a été précieuse et jamais je n'y serai parvenu seul.

    Merci merci merci !!

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Requete sur une seul table
    Par jaskoula1979 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/07/2012, 19h10
  2. problème requete imbriqué sur une seule table
    Par vanhouten dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/01/2009, 16h35
  3. 2 requete sur une meme table en une seule
    Par Nizarazu dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/08/2006, 21h03
  4. [SQL serveur] [debutant] requette sur une seule table
    Par glanumf dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2006, 15h27
  5. DOUBLE REQUETE SUR UNE MEME TABLE
    Par MORAS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/01/2006, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo