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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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