Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 17/06/2011, 13h36   #1
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
Par défaut select mysql un peu particulier..

Bonjour à tous,

je développe un site perso dans lequel j'ai une table d'utilisateur et une autre avec les livres qu'ils ont chez eux..
J'ai une table avec un id_user et id_livre qui donne ceci :

user livre
1

2 1

3 1
3 2

4 1
4 2
4 3

5 17
5 18
5 19
5 20

Je cherche à sortir dans l'ordre les utilisateurs qui ont le plus de livres différents des autres !

Dans ce cas là ça devrait me ressortir :
utilisateur 5 et utilisateur 4
(car l'utilisateur 3 à des livres que l'utilisateur 4 a aussi, donc je ne veux pas le lister...)

En faisant un mysql_query en DESC ça ne marche pas bien entendu car la requêtre me liste tout

Mon niveau php atteint ses limites là

Merci à une âme charitable qui pourra m'aider !
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h44   #2
Invité de passage
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2011
Messages : 5
Points : 4
Points : 4
salut, je suis pas sur mais tu peux essayer de mettre un LIMIT = 2 à la fin de ta requête.
(je suis pas sur de la syntaxe.)
donne des news
gsof23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h45   #3
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 34
Points : 31
Points : 31
Bonjour maxence64,

je n'ai pas de réponse pour le moment pour faire ton opération en une seulement requête ( > 5 min de réflexion), mais déjà commence avec cette requête cela va t'aider.

Code :
SELECT id_user, count(id_livre) as nb_livre FROM livre  group by id_user ;
Elle te permet d'afficher le nombre de livres par utilisateur.
Après tu peux gérer cela en php tranquillement.

Cdlt.
cycyand1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h52   #4
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2009
Messages : 236
Points : 322
Points : 322
Citation:
Envoyé par gsof23 Voir le message
salut, je suis pas sur mais tu peux essayer de mettre un LIMIT = 2 à la fin de ta requête.
Le limit ne sert qu'à limiter le nombre de résultat.

Pour ton problème je suis pas sur mais test quelque chose dans ce style :

Code :
1
2
3
4
5
SELECT user
FROM matable
WHERE livre in (SELECT livre FROM rel GROUP BY livre HAVING count(*) = 1)
GROUP BY user
ORDER BY 'desc'
Si elle passe (prie) elle retourne juste les id si tu veut afficher les nom tu rajoute ta table avec les libelle et tu fait la jointure.
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 17h21   #5
Membre du Club
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 36
Points : 55
Points : 55
Hum c'est quelque chose qui demande une bonne réflexion,
Je commencerai par faire une liste des livres qui ont le moins de lecteur, pour chercher ensuite ceux qui ont le plus de livres dans cette liste. Mais c'est loin d'être une solution parfaite ^^

Si on veut quelque chose de fiable, c'est un traitement qui risque fort d'être lourd car dans l'idéale il faudrait comparer les collections de livre de chaque utilisateur à toutes les autres pour trouver les plus différentes. Par exemple,
si je veux les 10 collections les plus différentes :

Accrochez - vous !

1 - Je prends 10 collections , je les compares entres elles pour trouver combien de livre une collection a en commun avec TOUTES les collections.

3 - Pour toutes les collection restantes je regarde une par une le nombre de livres commun avec chacune des 10 présélectionnées.

3.1 - Si elle a moins de livre en commun qu'une des 10 collections, on supprime la collection qui a le plus de livre en commun des 10 collections et on ajoute la collection comparé à la liste des 10 collections.

3.2 - Sinon on passe à la suivante.

Cela va ensuite dépendre du nombre de livres et d'utilisateurs. Mais sur un nombre relativement important il y a de grande chances pour que finalement presque toutes les collections aient beaucoup de livres en communs les unes avec les autres.
westdigit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 17h43   #6
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
Bonjour,
je ne suis pas sur à 100% mais je pense que ce doit être ca:
Code :
1
2
3
4
5
6
 
select count(*) as max
from userlivre U1
where U1.id_livre not in (select U2.id_livre from userlivre U2 where U1.id_user <> U2.id_user)
group by U1.id_user
order by desc max
une erreur est possible sur l'order by mais je pense que le reste est juste
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 18h15   #7
Membre du Club
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 36
Points : 55
Points : 55
Je ferais juste cette petite correction :

Code :
1
2
3
4
5
6
7
 
select count(*) as max
from userlivre U1
where U1.id_livre not in (select U2.id_livre from userlivre U2 where U1.id_user <> U2.id_user)
group by U1.id_user
order by max desc
Limit 0, 10;
Pour avoir les 10 plus différentes.
westdigit est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 15h52   #8
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
Je vous remercie à tous pour vos réponses, mais ça fait plusieurs jours que je planche dessus et je n'y arrive toujours pas

Le problème avec count c'est que ça va me retourner effectivement le nombre de user qui ont le plus de livres différents...
Mais moi je voudrais que ça me retourne "quel user" ?

Il faut absolument que ça me retourne : user 5 et user 4
et je n'y arrive toujours pas...

edit : ATTENTION
s'il y a un 6e utilsiateur qui se rajoute et qui a les livres 20, 19, 18, 17 ET 16
alors ça annule l'utilisateur 5 et j'aurais donc le résultat de ma requête qui m'affichiera :
Les membres qui ont le plus de livres différents des autres sont utilisateurs 6 et utilisateur 3


un vrai casse tête !!

re edit : et personne ne m'a parler de select "distinct", on m'a pourtant dis que je devais utiliser ça pour ne pas me ressortir plusieurs fois l'utilisateur 5...
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h44   #9
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
Citation:
Envoyé par maxence64 Voir le message


Les membres qui ont le plus de livres différents des autres sont utilisateurs 6 et utilisateur 3

un vrai casse tête !!
il me semblait que lorsque un utilisateur possède des livres des autres alors il ne devait pas apparaitre???

sinon si tu peux faire ca comme ca tu auras les id:

Code :
1
2
3
4
5
6
7
 
select U1.id_user, count(*) as max
from userlivre U1 
where U1.id_livre not in (select U2.id_livre from userlivre U2 where     U1.id_user <> U2.id_user)
group by U1.id_user
order by max desc
Limit 0, 10;
Après libre à toi d'utiliser les données récupérées, je pense que de meilleur expert que moi pourront corriger ce que j'ai fait si ce n'est pas correcte
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 17h37   #10
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
Citation:
Envoyé par Retrokiller069 Voir le message
il me semblait que lorsque un utilisateur possède des livres des autres alors il ne devait pas apparaitre???
oui et non, la requête doit afficher par ordre de quantité les users qui ont le plus de livres , donc au début ça va prendre celui qui BEAUCOUP de livres et ce n'est que APRES que la requête (qui va chercher ceux d'en dessous, qui en ont moins) ne prendra PAS ceux qui ont des livres identiques au 1er choisi par la requête


je vais essayer la tienne
(bizarre toujjours pas de "distinct" dans vos exemples..)
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h57   #11
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
Citation:
Envoyé par maxence64 Voir le message
oui et non, la requête doit afficher par ordre de quantité les users qui ont le plus de livres , donc au début ça va prendre celui qui BEAUCOUP de livres et ce n'est que APRES que la requête (qui va chercher ceux d'en dessous, qui en ont moins) ne prendra PAS ceux qui ont des livres identiques au 1er choisi par la requête
heu dans ce cas ce que j'ai fait ne te permettras pas de faire la seconde étape...

Citation:
Envoyé par maxence64 Voir le message
je vais essayer la tienne
(bizarre toujjours pas de "distinct" dans vos exemples..)
Désolé je ne suis pas fort pour utilisé les distincts
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 18h01   #12
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
génial ! j'ai trouvé grâce aux exemple Retrokiller069 !!
j'ai dû bidouillé un ou 2 trucs, mais merci ! car je ne connaissais pas la syntaxe U1. et tout ça...

résolué !
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h09.


 
 
 
 
Partenaires

Hébergement Web