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 :

fusionner plusieurs lignes d'un champs dans un select?


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut fusionner plusieurs lignes d'un champs dans un select?
    Salut
    bon mon titre est un peu long et ne veut pas dire grand chose alors je vais essayer d'expliquer clairement les choses ici!

    J'ai une base de données mysql avec une table qui contien les champs suivants:
    id----------date------------------ip--------------id_bien-nb
    num | 12/10/2008 |192.168.0.1-186.10.0.5... | 150 | 40

    le champ ip contient des ip séparés par des "-", chaque ligne contient des ip séparés par des tirets

    j'aurais voulu comparer les ip de toutes les colonnes pour voir si il y avait des doublons pour au final ne compter que les ip uniques.

    J'espere que j'ai été clair...
    J'ai voulu faire quelque chose avec SELECT concat(ip) mais apparrement ça ne sert à concatener (?) que des champs différents et pas plusieurs lignes du meme champs...

    si vous avez des pistes je suis preneur!
    merci d'avance gwen

  2. #2
    Membre régulier
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 87
    Points
    87
    Par défaut
    Hello,
    si j'ai bien compris tu devrai pouvoir t'en sortir avec cette fonction:

    http://dev.mysql.com/doc/refman/5.0/...n_group-concat

  3. #3
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    ha ben j'avais vu cette fonction, j'avais même essayé de l'utiliser mais je n'avais pas réussi...
    enfin si tu penses que c'est ça qui doit m'aider je vais regarder de plus prés très vite!
    merci de ton aide!

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Peux-tu nous faire un petit tableau présentant le résultat que tu voudrais obtenir ?

  5. #5
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt...


    c´est toi qui a "dessinee" la bd ?

    si wi, question retorique: tu sais ce que dis la première forme normale ?

    je crois que ca dois etre comme ca, que ca se dis

  6. #6
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    euh désolé jota, mais je n'ai rien compris à ce que tu m'as dit, tu parles de quoi?

    pour le résultat, imaginons cette table:
    id----------date------------------ip--------------id_bien-nb
    num | 12/10/2008 |192.168.0.1-186.10.0.5... | 150 | 40
    num | 12/10/2008 |100.18.50.3-156.19.7.3... | 125 | 25
    num | 13/10/2008 | 89.560.0.1-186.10.0.5... | 178 | 86

    je souhaiterais obtenir dans mon résultat tous les ip du 12/10, après ce que je vai en faire ne vous intéresse peut être pas, mais de cette manière je vais pouvoir, en php, en fait un array (avec split('-',$result[ip]) pour ensuite déterminer si il y a des doublons et dans ce cas compter uniquement les ip uniques.

    je suis pas sûr d'être trés clair surtout que je viens de rajouter des nouvelles données au problème (mais ne vous en occupez pas!)...
    je n'ai pas encore essayer group concat, mais je vous tiens au courant

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Pas besoin de PHP pour ça ! Pour avoir la liste des IP distinctes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUBSTR(ip FROM 1 FOR LOCATE('-', ip)) AS ip -- ip de gauche
    FROM ta_table
    WHERE `date`= '2008-10-12'
    UNION -- distincte par défaut
    SELECT SUBSTR(ip FROM LOCATE('-', ip)) -- ip de droite
    FROM ta_table
    WHERE `date`= '2008-10-12'
    Si seul le nombre d'IP distinctes t'intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COUNT(*) 
    FROM (SELECT SUBSTR(ip FROM 1 FOR LOCATE('-', ip)) AS ip
      FROM ta_table
      WHERE `date`= '2008-10-12'
      UNION
      SELECT SUBSTR(ip FROM LOCATE('-', ip))
      FROM ta_table
      WHERE `date`= '2008-10-12'
    ) AS U

  8. #8
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    les requêtes que tu m'as fourni n'ont pas l'air de fonctionner trés bien...
    la premiere me met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #1064 - You have an error in your SQL syntax; 
    check the manual that corresponds to your MySQL server version f
    or the right syntax to use near 'FROM ( '-' , ip ) ) AS ip  
    FROM statistiques  WHERE `date` = '2008-01-14'  UNION' at line 1
    et la 2° m'envoie 2 comme résultat...

    je continue à essayer de comprendre tes requetes, merci quand meme pour l'instant

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par gwena54 Voir le message
    les requêtes que tu m'as fourni n'ont pas l'air de fonctionner trés bien...
    la premiere me met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #1064 - You have an error in your SQL syntax; 
    check the manual that corresponds to your MySQL server version f
    or the right syntax to use near 'FROM ( '-' , ip ) ) AS ip  
    FROM statistiques  WHERE `date` = '2008-01-14'  UNION' at line 1
    D'après le message d'erreur, tu as oublié un petit LOCATE entre FROM et ('-', ip)...

    Citation Envoyé par gwena54 Voir le message
    et la 2° m'envoie 2 comme résultat...
    et tu avais plus de 2 ip distinctes le 14 janvier ?
    Citation Envoyé par gwena54 Voir le message
    je continue à essayer de comprendre tes requetes, merci quand meme pour l'instant
    Je vais expliquer plus en détails :
    • LOCATE('-', ip) détermine la position du tiret dans la colonne ip ; supposons par exemple que ce soit le 20ème caractère
    • SUBSTR(ip FROM 1 FOR LOCATE('-', ip)) extrait 20 caractères de l'ip à partir du premier (FROM 1) ; c'est donc ce qui est à gauche du tiret (en fait, ça doit prendre le tiret lui aussi, j'aurais dû ôter -1)
    • SUBSTR(ip FROM LOCATE('-', ip)) extrait tous les caractères d'ip à partir du 20ème ; c'est donc ce qui est à droite du tiret (en fait, il faudrait partir du 21ème)
    • le premier SELECT prend donc l'ensemble des IP de gauche, le second l'ensemble des ip de droite
    • UNION met les deux SELECT bout à bout, en éliminant les doublons


    Et voici la version corrigée (avec les +1 et -1) de ma première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUBSTR(ip FROM 1 FOR LOCATE('-', ip) - 1) AS ip
    FROM ta_table
    WHERE `date`= '2008-01-14'
    UNION -- distincte par défaut
    SELECT SUBSTR(ip FROM LOCATE('-', ip) + 1)
    FROM ta_table
    WHERE `date`= '2008-01-14'

  10. #10
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    oui oui j'en ai plus que 2, au moins... 50 :p
    sinon la requête que tu as corrigé, avec le locate, substr... est ce que tu es sûr que ça peut fonctionner dans mon cas, parce que dans mon champ ip je peux avoir 2 ip comme 100 séparés par des tirets!
    Et d'après ce que je comprends de la requête il ne m'en séparerait que 2, en fait je ne vois pas trop où la requête pourrait faire une sorte de boucle pour séparer tous les ip...

    bon sinon je teste ça et je te tiens au courant!

    c'est vraiment très gentil de ta part!

    edit: j'ai toujours la meme erreur...

  11. #11
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    je viens de m'apercevoir que les données présentes dans ma base n'étaient pas correctes, du coup les résultats affichés étaient complètement faussés, je refais des tests dans la journée...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Je crois que la requête d'Antoun est faite pour 2 ip, il n'as pas vu que tu pouvais en avoir beaucoup plus

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par gwena54 Voir le message
    oui oui j'en ai plus que 2, au moins... 50 :p
    sinon la requête que tu as corrigé, avec le locate, substr... est ce que tu es sûr que ça peut fonctionner dans mon cas, parce que dans mon champ ip je peux avoir 2 ip comme 100 séparés par des tirets!
    Non, effectivement, il n'en prend que deux. J'avais cru comprendre, à tort, que tes ip étaient des plages, avec un début et une fin, et donc qu'il n'y en avait que deux.
    Citation Envoyé par gwena54 Voir le message
    Et d'après ce que je comprends de la requête il ne m'en séparerait que 2, en fait je ne vois pas trop où la requête pourrait faire une sorte de boucle pour séparer tous les ip...
    C'est faisable en SQL... supposons que ta colonne ip soit un VARCHAR(1000). Il faudrait alors utiliser une table contenant les nombres de 1 à 1000, et faire un produit cartésien (ou une jointure ne gardant que les détections du tiret, du début et de la fin).
    Par exemple, avec Mille(Num INT), ça donnerait qqch comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT SUBSTR(T.ip FROM M.Num FOR M2.Num - M.Num +1 ) AS ip
    FROM ta_table T
      INNER JOIN Mille M ON SUBSTR(T.ip FROM M.Num FOR 1) = '-' OR M.Num = 1
      INNER JOIN Mille M2 ON M2.Num > M.Num 
         AND (SUBSTR(T.ip FROM M2.Num FOR 1) = '-' OR M2.Num = CHAR_LENGTH(ip))
    Evidemment, on peut trouver plus simple de faire un split en PHP.

  14. #14
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    oula!! mon dieu quand j'ai vu ta requête j'ai eu tellement peur!!

    bon je crois que je vais m'en tenir au split alors, ça sera peut etre plus de mon niveau, en même temps comment je peux concurrencer un admin mysql du forum et surtout un auteur de bouquin sur mysql...

    merci de ton aide quand même, je vais donc faire un split et tout le tralala en php pour arriver à mes fins.
    De toute façon ce n'est pas trop grave si ce 'est pas purement optimisé, c'est une requete qui servira de temps en temps seulement (genre une 10° de fois en 1 semaine... tant de mal rien que pour ça oui je sais )

    Merci encore!
    (plus qu'à mettre résolu moi...)

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

Discussions similaires

  1. Grouper des lignes selon un champs dans une listView
    Par Msysteme dans le forum Windows Forms
    Réponses: 10
    Dernier message: 26/02/2009, 19h13
  2. Plusieurs lignes de texte statique dans une inputdlg box
    Par sango85 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 08/01/2009, 13h48
  3. Réponses: 5
    Dernier message: 27/09/2007, 13h39
  4. Réponses: 6
    Dernier message: 08/08/2007, 17h41
  5. Réponses: 2
    Dernier message: 19/05/2004, 10h13

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