Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2011, 15h22   #1
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 117
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 117
Points : 25
Points : 25
Par défaut Contrainte sur valeur d'un champ

Bonjour,

J'ai une table sql qui ressemble à ça:

- id, id unique
- type, tinyint
- url varchar

Exemple de données:

- 1, 1, www.google.com
- 2, 1, www.bing.com
- 3, 2, www.yahoo.com
- 4, 2, www.facebook.com
- 5, 3, www.twitter.com
- 6, 3, www.wikipedia.com
Je dois prendre 4 valeurs aléatoires dans cette table, j'ai donc fait:

Code :
1
2
 
SELECT id, type, url FROM TABLE ORDER BY RAND() LIMIT 0, 4
Ça fonctionne tout bien, mais maintenant je dois faire qu'il y ait au moins une fois un "type" de chaque dans mon résultat de requête....

Exemple de résultat juste:

- 1, 1, www.google.com
- 3, 2, www.yahoo.com
- 6, 3, www.wikipedia.com
- 5, 3, www.twitter.com

Les 3 "type" sont bien là...

Exemple de résultat faux:

- 4, 2, www.facebook.com
- 3, 2, www.yahoo.com
- 6, 3, www.wikipedia.com
- 5, 3, www.twitter.com

Il manque le type 1....

Est-ce possible de faire ce genre de requête avec MySQL?

Merci d'avance.
nesswaw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h38   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Si tu sais combien de types différents il y a dans la table, tu peux toujours faire
Code SQL :
1
2
3
4
5
6
7
 SELECT id, type, url FROM TABLE WHERE type = 1 ORDER BY RAND() LIMIT 1
UNION
SELECT id, type, url FROM TABLE WHERE type = 2 ORDER BY RAND() LIMIT 1 
UNION
SELECT id, type, url FROM TABLE WHERE type = 3 ORDER BY RAND() LIMIT 1
UNION
...
Mais je ne crois pas qu'on ait droit au ORDER BY et au LIMIT dans chaque requête, je crois qu'on doit les réserver à la requête résultante des UNION.
En outre, tous ces ORDER BY RAND() ça risque d'être assez pénalisant, surtout si la colonne type n'est pas indexée.
A tester, à tout hasard.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h46   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Avec UNION, on ne peut mettre qu'un seul ORDER BY commun (sauf peut-être à faire plein de sous-requêtes).
Du coup, et surtout avec les limitations de MySQL en termes de SQL, ça me paraît compromis pour le faire directement...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 15h26   #4
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 117
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 117
Points : 25
Points : 25
Bonjour,

Oui j'ai 3 types différents, j'ai donc essayé ça, mais ça ne fonctionne pas:

Code :
1
2
3
4
5
6
7
 
SELECT id, type, url FROM TABLE WHERE type = 1
UNION
SELECT id, type, url FROM TABLE WHERE type = 2
UNION
SELECT id, type, url FROM TABLE WHERE type = 3
ORDER BY RAND() LIMIT 4
Mais ça me sort pas toujours minimum 1 de chaque type...dès fois ça me sort 4 ligne du type 2...

C'est tout simplement pas possible en une requête? Je devrais faire 3 requêtes? ça va vitre faire du lourd....

Merci pour vos réponses.

[EDIT]: En testant un peu, je suis arrivé à un résultat:

Code :
1
2
3
4
5
6
 
(SELECT id, pub, url FROM pub WHERE type=1 ORDER BY RAND() LIMIT 1)
UNION ALL
(SELECT id, pub, url FROM pub WHERE type=2 ORDER BY RAND() LIMIT 2)
UNION ALL
(SELECT id, pub, url FROM pub WHERE type=3 ORDER BY RAND() LIMIT 1)
Avec cette requête j'arrive à avoir mes 3 types minimun, attention à ne pas oublier les () sinon ça ne fonctionne pas (sous Mysql), apèrs à tester aux niveaux des perf...je vais voir

Si vous avez une meilleure solution, je suis toujours preneur

Merci
nesswaw est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h52.


 
 
 
 
Partenaires

Hébergement Web