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 :

Mélanger des tuples en conservant l'ordre relatif


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut Mélanger des tuples en conservant l'ordre relatif
    Bonjour,

    Le titre est un peut confus mais ce que je veux faire est assez simple, je vais prendre un petit exemple.

    J'ai une table qui contient plusieurs termes, appartenant à des catégories, ex: Transports, Animaux, Pays

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Transports: | Animaux: | Pays:
    avion       | chameau  | belgique
    bateau      | chat     | canada
    bus         | chien    | chine
    metro       | lion     | france
    moto        | rat      | japon
    train       |          | suisse
    velo        |          |
    voiture     |          |
    Ce que je voudrais, c'est une requête SQL qui me permettrait de récupérer ces tuples mélangés au niveau des catégories, mais qui reste toujours ordonnés par rapport aux autres tuples de la même catégorie.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    avion       (Transport)
    chameau     (Animaux)
    belgique    (Pays)
    canada      (Pays)
    bateau      (Transport)
    chat        (Animaux)
    bus         (Transport)
    On peut voir que l'ordre à l'intérieur de la catégorie Transport est conservé : bus est après bateau, bateau est après avion...
    Et c'est pareil pour toutes les catégories.

    Je me demande si c'est possible de faire ça juste en SQL, ça me paraît difficile mais on ne sait jamais, donc si vous avez une idée...

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : mars 2005
    Messages : 1 683
    Points : 2 575
    Points
    2 575
    Par défaut
    Je donne une requête générique car vous n'avez pas fourni la définition de vos tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
    	tmpCATEGORIE.LIB_CATEGORIE
    	ELEMENT.LIB_ELEMENT
    FROM (	SELECT 
    			CATEGORIE.LIB_CATEGORIE
    			RAND() as CLASSEMENT
    		FROM CATEGORIE
    	) tmpCATEGORIE 
    		INNER JOIN ELEMENT 
    			ON CATEGORIE.IDCATEGORIE = ELEMENT.IDCATEGORIE
    ORDER BY 
    	tmpCATEGORIE.CLASSEMENT, 
    	ELEMENT.LIB_ELEMENT
    L'idée est là. Sous requête sur la table à réordonner puis jointure avec l'autre table et enfin un tri sur la colonne classement aléatoire issue de la sous requête.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup d'avoir répondu, mais malheureusement c'est pas ça que je veux faire.

    La requête que tu as écrit sert à retourner les différents éléments regroupés par catégorie, avec l'ordre des catégories aléatoire.

    Mais c'est vrai que je me suis mal expliqué, j'aurais pas dû prendre cet exemple.

    Oubliez ça, à la place voilà mon vrai schéma :

    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
     
    CREATE TABLE IF NOT EXISTS `ex_article` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'date de création du tuple',
      `categorie_id` int(11) DEFAULT NULL COMMENT 'FK ex_categorie.id',
      `titre` varchar(150) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
     
    INSERT INTO `ex_article` (`id`, `created`, `categorie_id`, `titre`) VALUES
    (1,  '2012-08-01 17:36:20', 1, 'La palette de couleurs web'),
    (2,  '2012-08-01 17:37:34', 1, 'Créer un masque vectoriel '),
    (3,  '2012-08-01 17:37:44', 1, 'Modifier la profondeur des couleurs'),
    (4,  '2012-08-01 17:37:53', 1, 'Installer une brush'),
    (5,  '2012-08-01 17:38:18', 1, 'Créer une flèche vectorielle'),
    (6,  '2012-08-01 17:39:11', 2, 'Différence entre PAL et NTSC'),
    (7,  '2012-08-01 17:39:44', 2, 'Dessin de trajectoire'),
    (8,  '2012-08-01 17:40:04', 2, 'Changer la taille de la grille'),
    (9,  '2012-08-01 17:41:13', 3, 'Booléens et Probooléens'),
    (10, '2012-08-01 17:41:44', 3, 'Modéliser une bouteille avec le modifier lathe');
     
    CREATE TABLE IF NOT EXISTS `ex_categorie` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `lib` varchar(250) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
     
    INSERT INTO `ex_categorie` (`id`, `lib`) VALUES
    (1, 'Photoshop'),
    (2, 'After Effects'),
    (3, '3D Studio Max');
    J'ai 2 tables : une table ex_article qui contient tout simplement des articles de contenu d'un site web, et ces articles sont attachés à des catégories : la table ex_categorie.

    (En l’occurrence ce sont de mini tutoriels pour différents logiciels : Photoshop, After Effects, 3D Studio Max...)


    Je vais bientôt planifier la publication de tous ces contenus (plus de 50 au total), à raison d'un article publié par jour (automatiquement).

    Pour cela je vais simplement récupérer les articles que j'ai écrit sur ma base en local sur le serveur de prod, avec une tâche planifiée qui va publier automatiquement un article tous les jours.

    Le problème c'est que je n'ai pas envie de les publier dans l'ordre chronologique, car sinon il y aurait d'abord que des articles sur Photoshop, puis que des articles After Effects...

    Je préfère mélanger un peut tout ça, pour changer de sujet chaque jour et pas toujours parler du même logiciel.

    Sauf que je ne peux pas me contenter d'un RAND(), car j'ai des contraintes sur l'ordre de publication.

    Par exemple dans l'article #5 : Créer une flèche vectorielle, je fais référence (lien hypertexte) à un autre article : #1 : La palette de couleurs web.

    Donc j'ai besoin que l'article #1 soit publié avant l'article #5.
    Ces contraintes n’existent qu'à l'intérieur d'une même catégorie.
    Ainsi, je ne ferais jamais référence à un article Photoshop dans un article After Effects.

    Donc pour résumer, il me faut une requête qui retourne tous les articles, mélangés (1 article Photoshop, 2 articles After Effects, 1 article Photoshop, 2 articles 3D Studio Max...), tout en conservant leur ordre relatif à l'intérieur des catégories (ex: l'article #5 doit se trouver après l'article #1).

    J'espère que c'est plus clair.

    C'est assez compliqué comme règle de gestion, je sais pas si c'est possible à faire en SQL.

  4. #4
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    janvier 2007
    Messages
    1 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 554
    Points : 2 353
    Points
    2 353
    Par défaut
    Et en faisant simplement un order by sur les "tuples" ?

    Les catégories seront mélangées, et les tuples toujours dans l'ordre alphabétique.
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    16 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    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 678
    Points : 33 723
    Points
    33 723
    Billets dans le blog
    14
    Par défaut
    Je vais bientôt planifier la publication de tous ces contenus (plus de 50 au total), à raison d'un article publié par jour (automatiquement).
    Vous n'avez donc pas besoin de trier tous les articles en une seule fois.
    Je pense que vous devriez créer une table publication (pub_id_article, pub_date)

    La requête ci-dessous donnera chaque jour un ordre aléatoire aux catégorie et prendra le premier article non publié.
    Il faut bien sûr que votre processus de publication alimente chaque jour la table publication.

    J'ai supposé aussi que les articles à publier dans l'ordre dans chaque catégorie sont aussi créés dans l'ordre dans la BDD car rien dans votre schémla ne donne la hiérarchie des articles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT a.id, a.titre
    FROM ex_article a
    INNER JOIN 
    (
    	SELECT id, RAND() AS ordre
    	FROM ex_categorie
    ) c ON c.id = a.categorie_id
    LEFT OUTER JOIN publication p ON p.pub_id_article = a.id
    WHERE p.pub_id_article IS NULL
    ORDER BY c.ordre, a.id
    LIMIT 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [XSLT 1.0] Conserver l'ordre des éléments
    Par med.k dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/09/2013, 19h06
  2. [9.0] Conserver l'ordre des enregistrements dans une requête
    Par mcdelay dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 27/08/2013, 13h59
  3. conserver l'ordre des sorties standards
    Par taupinfada dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2011, 18h28
  4. Comportement différent des listes [] et des tuples () ??
    Par JujuKéblo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/10/2005, 10h08
  5. Réponses: 11
    Dernier message: 17/01/2005, 17h58

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