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

PHP & Base de données Discussion :

Select mysql un peu particulier... [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    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 !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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
    Par défaut
    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

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    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
    Par défaut
    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.

  6. #6
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    Bonjour,
    je ne suis pas sur à 100% mais je pense que ce doit être ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    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
    Par défaut
    Je ferais juste cette petite correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Par défaut
    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...

  9. #9
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Par défaut
    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..)

  11. #11
    Membre expérimenté Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Par défaut
    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

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Par défaut
    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é !

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

Discussions similaires

  1. un select case un peu particulier
    Par zooffy dans le forum Développement
    Réponses: 4
    Dernier message: 04/07/2008, 10h54
  2. [SGBD] Select MySQL
    Par Roromix dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/05/2006, 00h46
  3. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 14h30
  4. #define un peu particulier
    Par greuh dans le forum C
    Réponses: 14
    Dernier message: 12/10/2005, 16h42
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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