Select + rand unique - SQL/NoSQL - Programmation
Marsh Posté le 04-03-2013 à 02:02:37
Bonsoir,
Je ne suis pas sur d'avoir bien compris la demande... Comment sont liées les tables entre elles ?
J'ai codé rapidement le schéma de cette partie de bdd, peux-tu rajouter les liaisons de tables ?
Code :
|
J'ai aussi fait un jeu de test rapide, mais comme je ne sais pas comment sont liées les tables je ne suis pas sûr d'avoir bien deviné ^^
Code :
|
Et du coup la requête simplifiée de ce que tu demandes (pas de résultat aléatoire, et pas de distinction sur le GROUPE_ID de la table MERE)
Code :
|
Alors dis moi si j'ai bien compris ta demande et je te ferai la requete ^^
Je pense aussi, c'est un problème de passer par une fonction ? Ta BDD est sous Mysql ?
Marsh Posté le 04-03-2013 à 19:47:09
Bonsoir et merci pour ta réponse, je n'ai pas encore eu le temps de tester ta requête mais je vais t'éclairer sur certains points car j'ai oublier une chose hier.
Sinon je suis sous MySQL et toute proposition est la bienvenue, fonction, etc...
On a plusieurs pseudos dans la table NOM qui vont donner une appréciation sur un produit (suivant différents critères extérieurs et et non utile ici), je fais donc une premiere requete qui va me chercher les pseudos et qui pour chacun d'eux doit faire le boulot demandé dans le 1er post.
Il y a 4 fournisseurs (IDENTIFIANT dans la table MERE), et environ 30 types de produits (GROUP_ID).
On a également une variable appelé ici $genre qui détermine le nombre de produit que doit recevoir chaque pseudo chaque jour. (soit 4 soit 8 soit 12)
Le but est que chaque pseudo reçoive chaque jour un nombre de produit defini par $genre, et qui soit :
1 - soit 1 produit par IDENTIFIANT, soit 2 produits par IDENTIFIANT, soit 3 produits par IDENTIFIANT
2 - Différent des produits qu'ils a eu la veille
3 - Différents entre eux.
Les liaisons entre TABLE NOMS, TABLE fille1 et TABLE fille2 sont les NOM.
Pour la TABLE MERE il n'y a pas de lien car c'est là qu'on doit aller chercher les produits au hasard mais sans doublons dans la sélection du jour et sans doublon par rapport a la veille.
Par doublon je parle de GROUP_ID, même si c'est pas le même fournisseur c'est le même produit donc il a le même GROUP_ID
Ensuite chaque jours a 0h00, une cron vient vider la table fille1, copie la table fille2 dans fille1, vide la table fille2 et fait une nouvelle selection qu'il insert dans la table fille2.
j'espère avoir été plus précis dans l'execution du système
Merci.
Marsh Posté le 05-03-2013 à 01:28:19
je poste les structures exactes :
Code :
|
Code :
|
Code :
|
on part sur l'exemple pour l'user1 soit 4 type de produits a tester (1 de chaque éditeur)
l'user1 a eu hier 4 catégories de produits différentes dont 1 de chaque éditeur.
Il faut que pour aujourd'hui, on lui attribue 1 catégorie de chaque fournisseur (donc 4 en tout), différentes de la veille et différentes entre elles. C'est le GROUP_ID qui doit differer.
et donc dans la table `test_fille2` on doit avoir 4 lignes du style : 'user1' - 'id (de la table mere)' - 'group_id'
je pense que ça ira mieux avec les infos exactes.
Merci.
Marsh Posté le 05-03-2013 à 09:59:14
Je suis pas sûr d'avoir compris ce que tu veux. Mais tu peux tenter ça:
Code :
|
Marsh Posté le 05-03-2013 à 22:07:54
Bonsoir, merci pour votre requête qui s'approche de ce que je souhaite, mais il reste un problème.
J'ai utilisé votre requete de cette façon : $user = 'user1';
Code :
|
et en fait on a jamais 2 GROUP_ID identique entre eux, ni identique a un de la veille, mais par contre il me sort des fournisseurs identiques hors il me faut pour 4 GROUP_ID => 4 Fournisseurs differents. pour 8 GROUP_ID, 2 de chaque fournisseur et pour 12 GROUP_ID, 3 de chaque fournisseur.
Voici 1 exemple de ce qu'il me sort : (ici 2 fois le fournisseur 3)
GROUP_ID : 7 - FOURNISSEUR : editeur4 - ID : 17
GROUP_ID : 12 - FOURNISSEUR : editeur1 - ID : 23
GROUP_ID : 10 - FOURNISSEUR : editeur3 - ID : 21
GROUP_ID : 6 - FOURNISSEUR : editeur3 - ID : 19
ou encore ici 2 fois le fournisseur 1
GROUP_ID : 11 - FOURNISSEUR : editeur4 - ID : 22
GROUP_ID : 12 - FOURNISSEUR : editeur1 - ID : 23
GROUP_ID : 10 - FOURNISSEUR : editeur3 - ID : 21
GROUP_ID : 5 - FOURNISSEUR : editeur1 - ID : 11
Merci.
Marsh Posté le 05-03-2013 à 23:52:29
Bon finalement j'ai codé un truc un peu a l'arrache qui envoit ligne par ligne dans la table test_fille2 en vérifiant de ne pas faire de doublons, c'est un peu laid mais j'ai pas trouvé d'autre solution.
Je poste ce que ça donne si ça peut aider quelqu'un.
Code :
|
Si vous avez une solution plus propre je suis preneur ^^
Marsh Posté le 03-03-2013 à 23:00:20
Bonsoir, j'ai un problème sur lequel je bloque, je vous explique rapidement avant de vous décrire les tables.
Je dois sélectionner aléatoirement dans une table un nombre X de lignes (2 pour l'exemple), ces lignes doivent avoir un GROUPE_ID différent d'un de celui présent dans une autre table et doivent être différents entre eux lors de la sélection. Le tout doit être inséré dans une nouvelle table. Voici le détail des tables.
TABLE NOMS
ID(ai) | NOM
1_____A
2_____B
3_____C
TABLE MERE
ID(ai) | GROUPE_ID | IDENTIFIANT | CONTENU
1__________1___________01________xxx
2__________1___________02________xxx
3__________2___________01________yyy
4__________3___________03________zzz
5__________4___________04________aaa
6__________2___________03________yyy
TABLE fille1
NOM | GROUPE_ID
A ______ 1
A ______ 4
B ______ 1
B ______ 2
C ______ 3
C ______ 4
TABLE fille2 (la ou l'insertion se fait)
NOM | GROUPE_ID
-------------------------------------------------------------
En fait je sélectionne un NOM (ici A), je dois prendre 2 lignes de la TABLE MERE dont les GROUPE_ID sont différents entre eux et son aussi différents de ceux de la TABLE fille1 qui correspondent a ce NOM. Et je dois les insérer dans la table fille 2.
Concrètement dans l'exemple, A devrait avoir 2 lignes dans la TABLE fille2, 2 et 3 ou 3 et 2 peut importe l'ordre.
Je n'arrive pas a faire cette sélection particulière, quelqu'un saurait-il comment procéder s'il vous plait ?
Merci d'avance.