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

MySQL Discussion :

Plusieurs Order by rand() dans une même requête


Sujet :

MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2016
    Messages : 61
    Points : 48
    Points
    48
    Par défaut Plusieurs Order by rand() dans une même requête
    Bonjour à tous.
    Dans une table d'une base mysql, j'ai des lignes décrites par 6 variables V1, V2, ...., V6 (voir PJ).
    Mon problème est le suivant:
    Pour chaque groupe (v1,v2,v3,v4,v5,v6) de valeurs possible de ces variables, je voudrais tirer de façon aléatoire, 10 lignes, en utilisant une seule requête qui affichera tous les groupes de 10 lignes aléatoirement tirées.
    J'ai essayé les codes suivants:
    code1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM `matable` WHERE 
    V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and  V6='Ajeun'
    UNION
    SELECT * FROM `determinationbf` WHERE 
    V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and  V6='Gorgee'
    ORDER BY Rand() LIMIT 5;
    #ce code m'a renvoyé 5 des lignes des deux parties de la requête, alors que je souhaitais avoir 5 lignes pour chacune des deux parties de la requête.

    code2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM `matable` WHERE 
    V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and  V6='Ajeun'
    ORDER BY Rand() LIMIT 5
    UNION
    SELECT * FROM `determinationbf` WHERE 
    V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and  V6='Gorgee'
    ORDER BY Rand() LIMIT 5;
    # ce code ci n'a pas fonctionné

    espérant avoir été clair, je vous remercie par avance de votre aide.
    cordialement.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Pour faire ceci il faudrait que MySQmerde supporte les fonctions d’ordonnancement de la norme SQL:1999.
    Or MySQL n'en est même pas au niveau de la norme SQL2 de 1992.

    Avec un vrai SGBDR (PostGreSQL, SQL Server, Oracle...) cela se ferait de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH T AS
    (
    SELECT *, ROW_NUMBER() OVER(ORDER BY RAND()) AS N  
    FROM   matable 
    WHERE  V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and V6='Ajeun'
    UNION ALL
    SELECT *, ROW_NUMBER() OVER(ORDER BY RAND()) AS N  
    FROM  determinationbf 
    WHERE V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and V6='Gorgee'
    )
    SELECT *
    FROM   T
    WHERE N <= 5;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2016
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Grand merci à vous pour la réponse.
    Comme ce n'est pas possible avec MySql, y a t il une version de ce code que je pourrais utiliser sous Access?
    Encore, merci.

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut coliasso.

    Avec des parenthèses, cela fonctionnera mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ( SELECT * FROM `matable`         WHERE V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and V6='Ajeun'  ORDER BY Rand() LIMIT 5 )
    UNION
    ( SELECT * FROM `determinationbf` WHERE V1='FLA' and V2=1 and V3='ext' and V4=20 and V5= 'gambiaeS.1.' and V6='Gorgee' ORDER BY Rand() LIMIT 5 );
    Et voici un exemple qui illustre ce fonctionnement :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tabone`
    --------------
     
    --------------
    CREATE TABLE `tabone`
    ( `id`    integer unsigned AUTO_INCREMENT NOT NULL Primary Key,
      `col1`  varchar(255)                    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `tabone` (`col1`) values
      ('un'),  ('deux'),('trois'),('quatre'),('cinq'),  ('six'),     ('sept'),  ('huit'),
      ('neuf'),('dix'), ('onze'), ('douze'), ('treize'),('quatroze'),('quinze'),('seize')
    --------------
     
    --------------
    select * from tabone
    --------------
     
    +----+----------+
    | id | col1     |
    +----+----------+
    |  1 | un       |
    |  2 | deux     |
    |  3 | trois    |
    |  4 | quatre   |
    |  5 | cinq     |
    |  6 | six      |
    |  7 | sept     |
    |  8 | huit     |
    |  9 | neuf     |
    | 10 | dix      |
    | 11 | onze     |
    | 12 | douze    |
    | 13 | treize   |
    | 14 | quatroze |
    | 15 | quinze   |
    | 16 | seize    |
    +----+----------+
    --------------
    DROP TABLE IF EXISTS `tabtwo`
    --------------
     
    --------------
    CREATE TABLE `tabtwo`
    ( `id`    integer unsigned AUTO_INCREMENT NOT NULL Primary Key,
      `col1`  varchar(255)                    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `tabtwo` (`col1`) values
      ('one'),  ('two'),('three'),('four'),('five'),  ('six'),     ('seven'),  ('eight'),
      ('nine'),('ten'), ('eleven'), ('twelve'), ('thirteen'),('fourteen'),('fifteen'),('sixteen')
    --------------
     
    --------------
    select * from tabtwo
    --------------
     
    +----+----------+
    | id | col1     |
    +----+----------+
    |  1 | one      |
    |  2 | two      |
    |  3 | three    |
    |  4 | four     |
    |  5 | five     |
    |  6 | six      |
    |  7 | seven    |
    |  8 | eight    |
    |  9 | nine     |
    | 10 | ten      |
    | 11 | eleven   |
    | 12 | twelve   |
    | 13 | thirteen |
    | 14 | fourteen |
    | 15 | fifteen  |
    | 16 | sixteen  |
    +----+----------+
    --------------
    (select * from tabone ORDER BY Rand() LIMIT 5) union (select * from tabtwo ORDER BY Rand() LIMIT 5)
    --------------
     
    +----+----------+
    | id | col1     |
    +----+----------+
    |  1 | un       |
    |  2 | deux     |
    | 15 | quinze   |
    |  6 | six      |
    |  5 | cinq     |
    | 14 | fourteen |
    |  4 | four     |
    | 10 | ten      |
    |  1 | one      |
    +----+----------+
    --------------
    (select * from tabone ORDER BY Rand() LIMIT 5) union (select * from tabtwo ORDER BY Rand() LIMIT 5)
    --------------
     
    +----+----------+
    | id | col1     |
    +----+----------+
    | 15 | quinze   |
    |  2 | deux     |
    |  9 | neuf     |
    | 11 | onze     |
    |  5 | cinq     |
    | 16 | sixteen  |
    |  5 | five     |
    | 14 | fourteen |
    |  1 | one      |
    |  7 | seven    |
    +----+----------+
    --------------
    (select * from tabone ORDER BY Rand() LIMIT 5) union (select * from tabtwo ORDER BY Rand() LIMIT 5)
    --------------
     
    +----+---------+
    | id | col1    |
    +----+---------+
    | 12 | douze   |
    | 15 | quinze  |
    | 13 | treize  |
    |  3 | trois   |
    |  2 | deux    |
    | 15 | fifteen |
    |  6 | six     |
    |  1 | one     |
    |  9 | nine    |
    |  2 | two     |
    +----+---------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2016
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Salut, Artemus24.
    Grand merci de ta réponse.
    Cordialement.

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

Discussions similaires

  1. [MySQL] Extraire plusieurs champs d'une table dans une même requête
    Par la_chouette dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/11/2012, 12h11
  2. Réponses: 12
    Dernier message: 02/12/2010, 10h22
  3. Plusieurs count() dans une même requête
    Par DarkaMaul dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/11/2009, 18h20
  4. faire plusieur count dans une même requète
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/04/2008, 11h04
  5. Plusieurs style de liens dans une même page
    Par keishah dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/08/2006, 15h22

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