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

Requêtes MySQL Discussion :

Jointure basique mais ennuyante


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Jointure basique mais ennuyante
    Bonjour à tous,
    Je coince pour une petite jointure afin d'afficher toutes les videos avec la note de celles-ci par vote des internautes.

    En effet, avec ma requete actuelle, les vidéos qui s'affichent sont uniquement celle qui ont reçu minimum un vote.
    Autrement dit, toutes les autres vidéos n'étant pas noté, ne sont pas affiché, et j'ai beau tourner la requete dans tout les sens, je ne trouve pas.
    Mes table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `ratings` (
      `id` varchar(11) NOT NULL,
      `total_votes` int(11) NOT NULL default '0',
      `total_value` int(11) NOT NULL default '0',
      `used_ips` longtext,
      PRIMARY KEY  (`id`)
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `videos` (
      `idv` smallint(6) NOT NULL auto_increment,
      `date` date NOT NULL default '0000-00-00',
      `titre` tinytext NOT NULL,
      `cat` tinytext NOT NULL,
      `duree` tinytext NOT NULL,
      `url_thumb` tinytext NOT NULL,
      `url_video` tinytext NOT NULL,
      `visu` smallint(6) NOT NULL default '0',
      PRIMARY KEY  (`idv`)
    )

    idv correspond à l'id numerique de chaque vidéo.
    id dans la table ratings, correspond à l'id de la vidéo noté.

    Ma requete SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.total_votes, a.total_value, b.idv, b.titre, b.cat, b.duree, b.url_thumb, b.visu 
    from ratings a, videos b 
    WHERE a.id = b.idv
    Une personne m'a dit d'utiliser IS NULL, j'ai fait ceci avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (a.id = b.idv OR a.id IS NULL)
    Mais cela ne fait rien

    Exemple concret :

    2 vidéos dans la table vidéos, content pour IDV "23" et "54"

    Dans ma table rating, j'ai une des deux vidéos de noté, disons la 23, j'ai donc un enregistreement de vote avec comme ID 23.
    Cette vidéo s'affichera donc dans ma liste, mais pas la 54 qui ne possède pas d'enregistrement dans la table ratings car elle n'a pas de vote. Voila le dilème.

    Merci !
    bonne soirée

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Il faut passer par une jointure externe. Du coup, il faut prendre l'habitude d'écrire les jointures selon la norme SQL2 (ce qui est beaucoup plus pratique à l'utilisation).
    Un peu de lecture sur le sujet : http://sqlpro.developpez.com/cours/sqlaz/jointures/
    Ca donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.total_votes, a.total_value, b.idv, b.titre, b.cat, b.duree, b.url_thumb, b.visu 
    FROM ratings a
    LEFT JOIN videos b ON a.id = b.idv
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Bonsoir Ced,
    Désolé pour la balise Code, j'ai completement zapé !

    J'ai mis ta requete, cela à le meme effet, à savoir que seuls les videos avec un vote sont listé, les id des vidéos non présente dans la table rating ne s'affiche pas

    J'était tombé sur la page que tu as cité il y'a quelque jour, j'avais déja essayer en vain de trouver l'endroit qui pourrait m'aider, mais avec toute cette doc, je ne sais pas trop ce qui me conviendrais.

    Cordialement

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ooops !! A mon tour d'être désolé... Dur, dur, les fins de journées.
    J'ai mis la jointure dans le mauvais sens.
    Comme ça, ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT b.idv, b.titre, b.cat, b.duree, b.url_thumb, b.visu, a.total_votes, a.total_value
    FROM videos b
    LEFT JOIN ratings a ON b.idv = a.id
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup Ced !
    Je vais donc bien analyser la jointure pour bien la comprendre au besoin.
    Merci !

    Edit: hmm, après avoir regarder ta requete, c'est la meme chose que j'avais faite ! Mais mal, cependant c'était bien structuré.

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Okinou Voir le message
    après avoir regarder ta requete, c'est la meme chose que j'avais faite !
    Saluton,
    Oh que non, la jointure externe LEFT JOIN retournera toutes les lignes de la table videos qu'elles soient en jointure ou non avec des lignes de la table ratings.
    Dans les cas ou la jointure ne s'effectue pas les colonnes du SELECT censées provenir de la table ratings seront remplacées par des NULL dans le résultat.
    Alors qu'avec la syntaxe WHERE a.id = b.idv, équivalente à INNER JOIN ratings ON a.id = b.idv, seules les lignes des deux tables pour lesquelles la jointure s'opère seront présentes dans le résultat.
    Ce n'est donc pas du tout la même chose.
    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)

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Arf ! J'ai failli répondre la même chose...
    Mais en fait, je crois que ce qui revient effectivement au même qu'une jointure externe, c'est la seconde condition que donne Okinou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (a.id = b.idv OR a.id IS NULL)
    J'ai un peu cherché et ça semble être le cas, mais comme je n'utilise JAMAIS la théta-jointure (et encore moins dès qu'il s'agit de jointures externes), je n'ai pas vraiment testé...
    Ca présente, à mon sens, très peu d'intérêt (si ce n'est par curiosité), puisqu'il vaut mieux prendre l'habitude d'écrire des jointures normalisées.
    Comme ça, au moins, on contrôle ce qu'on fait .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Exact, je n'avais pas vu le petit complément modifiant la requête initiale.

    Ce qu'on peut en tirer aussi comme enseignement utile pour notre ami Okinou, c'est qu'à l'inverse, ajouter WHERE a.id IS NULL permet de ne retourner que les lignes pour lesquelles la jointure ne s'opère pas.
    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)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Bonjour,
    Merci de vos précisions, c'est vraiment top un forum comme celui-ci !

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

Discussions similaires

  1. Problème jointure basique
    Par Tonii dans le forum SQL
    Réponses: 9
    Dernier message: 13/07/2011, 10h22
  2. Jointure.. oui mais !
    Par consequence dans le forum Requêtes
    Réponses: 11
    Dernier message: 24/02/2010, 18h08
  3. Question basique mais perturbante.
    Par profete162 dans le forum Android
    Réponses: 2
    Dernier message: 29/09/2009, 15h11
  4. Quelle bibliothèque pour de la 2D basique mais désaliasée ?
    Par three minute hero dans le forum C++
    Réponses: 39
    Dernier message: 17/11/2007, 22h12
  5. [VBA-E] Basique mais comment utiliser un range ?
    Par epfyffer dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/03/2007, 12h15

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