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 :

Multiples Rand avec critère


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut Multiples Rand avec critère
    Bonjour,

    Ça as si bien marché la première fois que je me dit que tout est possible, alors je continue avec mes questions ! encore une fois, google n'a pas été mon ami...

    Table :
    ID - LOC - CC

    Voila je voudrais une requête qui pour chaque LOC me donne un CC pris au hasard dans la liste (excepté les CC ayant certaines valeurs, on va dire pour l'exemple 1, 7 et 12)

    Mes premiers essais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT cc 
    FROM matable 
    WHERE cc NOT IN (1,7,12) 
    GROUP BY loc 
    ORDER BY RAND() 
    LIMIT 1
    Forcement, cela ne marche pas, il ne me renvoi qu'un seul élément au lieu d'un par ville ...

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT cc FROM latable WHERE cc NOT IN(1,7,1) ORDER BY RAND()
    Car ton GROUP BY n'est pas....réglementaire.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Si Google n'est pas toujours ton ami, la FAQ MySQL peut le devenir .
    Dans l'exemple donné, il suffit de retirer le LIMIT 1...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par ced Voir le message
    Dans l'exemple donné, il suffit de retirer le LIMIT 1...
    Pas seulement, il faut utiliser DISTINCT en lieu et place de cet horrible GROUP BY.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT cc FROM latable WHERE cc NOT IN(1,7,1) ORDER BY RAND()
    Car ton GROUP BY n'est pas....réglementaire.
    Merci de ta proposition, mais cela ne renvoi pas un cc par loc, mais la liste de tous les cc ...(dans le désordre)

  6. #6
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Citation Envoyé par ced Voir le message
    Si Google n'est pas toujours ton ami, la FAQ MySQL peut le devenir .
    Dans l'exemple donné, il suffit de retirer le LIMIT 1...

    ced
    Ne marches pas non plus, j'ai dans ce cas la toujours la même réponse pour chaque loc ... surement la première de la liste. le ORDER RAND () se contente alors uniquement de me renvoyer ces réponses dans le désordre...

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Exact et désolé, le cahier des charges initial comportait
    pour chaque LOC
    là, on ne s'en occupe pas.
    Il faut dire que ça va être autrement coton juste en une seule requête.
    On pense immédiatement à faire une requête par LOC et de les mettre en UNION.
    Mais comment automatiser cela ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Je te propose cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT loc, 
    GROUP_CONCAT(DISTINCT cc ORDER BY RAND()) as ccs
    FROM latable 
    WHERE cc NOT IN(1,7,12) 
    GROUP BY loc
    Et tu ne prends que le premier cc de la colonne ccs.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut


    Voila ce que ca donne, réponse que je ne comprends pas. Mais ca me donne une idée pour mettre une sous requête dans le where ... vais voir ca.

  10. #10
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pop_town, 
    (SELECT pop_loc FROM population z WHERE z.pop_town = p.pop_town
    ORDER BY RAND( ) LIMIT 1) AS ccs
    FROM population AS p
    GROUP BY pop_town
    Voila la bonne réponse, merci à vous deux et à juvamine qui m'a beaucoup aidé aussi sur le chat.

  11. #11
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Cette colone BLOB c'est un bug de PMA, en réalité la colonne ccs contient la liste des cc du LOC, séparés par de virgules et classés aléatoirement.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  12. #12
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par lungzatar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pop_town, 
    (SELECT pop_loc FROM population z WHERE z.pop_town = p.pop_town
    ORDER BY RAND( ) LIMIT 1) AS ccs
    FROM population AS p
    GROUP BY pop_town
    Sauf que tu n'as pas le droit de faire un GROUP BY si tu n'as pas de fonction d'agrégation dans la projection.
    Un DISTINCT devrait pouvoir le remplacer.
    Et une sous-requête corrélée, c'est très gourmand en MySQL.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT distinct pop_town, 
    (SELECT pop_loc FROM population z WHERE z.pop_town = p.pop_town
    ORDER BY RAND( ) LIMIT 1) AS ccs
    FROM population AS p
    Je vais tester cela alors.

  14. #14
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Ca ne marche pas, il continue à me renvoyer des pop_town non distincts... ce qu'il me renvoi de façon distincte, c'est le "couple"

  15. #15
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Ça c'est SQLesquement correct, mais MySQLesquement gourmand (sous-requête corrélée)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  16. #16
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Bah que ce soit gourmand ça me gène pas, vu que l'alternative c'est de faire un "while" sur les 1000 villes ... et donc de faire 1000 fois la requête ...

    Par contre : comme je disait, ton distinct "where" que je le met ? car la moi il sert a rien du tout tel quel ...

    Je veut bien me "passer" du group by ... mais je vois pas comment pour le moment...

  17. #17
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Exact, exact, le DISTINCT opère sur le n-uplet, pas sur la colonne.
    Dommage que tu ne saches pas exploiter le résultat d'un GROUP_CONCAT, car là le GROUP BY devenait justifié et on s'affranchissait de la sous-requête corrélée.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  18. #18
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Je viens d'en lire un peu sur le group_concat et c'est super pratique pour moi en fait ... car ca me donne non pas un au hasard mais toutes les réponses prête a être mise dans un array avec implode (ou explode je sais plus je les confond toujours) ... rien ne m'empêchera donc de faire mon "rand" en php ensuite ...ou de mettre le order by rand en Mysql et de prendre le premier systématiquement comme tu le suggérais.

    On reprends donc ou on en était ... car ma requête se complique un peu !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pop_town, GROUP_CONCAT( DISTINCT pop_loc
    ORDER BY RAND( ) ) AS locs
    FROM population
    WHERE pop_job =10
    GROUP BY pop_town
    Comme tu peut le voir, j'ai rajouté une condition 'pop_job=10' ...

    Mais j'ai d'autres conditions : je ne veut que les pop_town pour lesquelles les villes ont un donnee : vil_maping>=(vil_map*vil_map)

    Dans cette table, qui s'appelle data_villes J'ai donc : vil_id, vil_map, vil_maping

    Je dois faire un inner join, je vais tenter de le faire mais j'aimerais bien un peu d'aide car je débute avec ce genre de requêtes complexes ...

    Trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.pop_town, GROUP_CONCAT( DISTINCT p.pop_loc
    ORDER BY RAND( ) ) AS locs
    FROM population as p INNER JOIN data_villes as v
    WHERE p.pop_town=v.vil_id AND p.pop_job =10 AND v.vil_map<(v.vil_maping*v.vil_maping)
    GROUP BY pop_town
    Y'a pas a dire je progresse, j'était un zéro hier, maintenant je suis un double-zéro ! vive moi

  19. #19
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Puisque tu veux progresser tu dois apprendre à ne pas mélanger les clauses de jointures (ON) avec les clauses de filtrage (WHERE ou HAVING). Question de lisibilité, de maintenabilité et de compréhension de la requête à la relecture.
    Je reprends donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.pop_town, 
    GROUP_CONCAT( DISTINCT p.pop_loc ORDER BY RAND( ) ) AS locs
    FROM population AS p
    INNER JOIN data_villes AS v ON p.pop_town=v.vil_id 
    WHERE  p.pop_job =10 
    AND v.vil_map<(v.vil_maping*v.vil_maping)
    GROUP BY pop_town
    Il te faut bien savoir qu'avec cette requête tu n'auras que les populations qui sont en jointure avec la table data_villes.

    PS tu peux remplacer (v.vil_maping*v.vil_maping) par POW(v.vil_maping,2)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  20. #20
    Membre averti
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Il te faut bien savoir qu'avec cette requête tu n'auras que les populations qui sont en jointure avec la table data_villes.
    Merci pour le pow, je met ca en place demain, ainsi que le ON a la place du where.

    Pour ce qui est de ta phrase que je cite, peut tu l'expliquer si il s'agit d'autre chose que : "Le script ne s'applique qu'aux population dans les villes correspondant à la clause 'pow' " car si c'est ca, c'est un fait exprès. Sinon n'hésite pas à clarifier tes dires pour un triple-zéro !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2003] Macro a définir (tableau avec critères multiples)
    Par Corradi dans le forum Excel
    Réponses: 10
    Dernier message: 16/05/2014, 10h58
  2. Requête Père-Enfant avec critères multiples sur enfants
    Par gtaman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/10/2013, 22h57
  3. [MySQL] Requête avec critères multiples
    Par malabarbe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/01/2008, 12h54
  4. [Excel] Selection multiple avec critères
    Par tibotibotibo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2005, 11h48
  5. Erreurs IIS avec Multiples Frames avec xmlrad
    Par powerlog dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/07/2003, 14h15

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