Partage
  • Partager sur Facebook
  • Partager sur Twitter

SELECT dans plusieurs tables

Sujet résolu
    21 décembre 2010 à 11:04:26

    Bonjour,

    Je souhaiterais sélectionner des éléments dans 2 tables en même temps sans utiliser les jointures, en fait je voudrais tout sélectionner et ranger ça par date, est-ce possible ?
    J'ai déjà essayé d'utiliser la méthode décrite dans ce tuto mais je n'arrive pas à ordonner ça par date et je n'arrive pas à en sélectionner plusieurs.

    Voici mon début de requête :
    SELECT
    articles.id AS id_art,
    articles.titre AS titre,
    articles.date AS date_art,
    articles.supprime AS supprime_art,
    aut_art.nom AS auteur_art,
    aut_art.id AS id_auteur_art,
    grp_art.nom AS groupe_art,
    grp_art.id AS id_groupe_art,
    commentaires.id AS id_com,
    commentaires.contenu AS contenu_com,
    commentaires.date AS date_com,
    commentaires.id_news AS id_news,
    aut_com.nom AS auteur_com,
    grp_com.nom AS groupe_com,
    grp_com.id AS id_groupe_com,
    aut_com.id AS id_auteur_com
    FROM articles, commentaires
    LEFT JOIN membres AS aut_com ON commentaires.id_auteur = aut_com.id
    LEFT JOIN groupes AS grp_com ON aut_com.id_groupe = grp_com.id
    LEFT JOIN membres AS aut_art ON articles.id_auteur = aut_art.id
    LEFT JOIN groupes AS grp_art ON aut_art.id_groupe = grp_art.id
    ORDER BY date_art, date_com DESC;
    

    Première erreur : "Unknown column 'articles.id_auteur' in 'on clause'", pourtant je sais qu'elle existe, j'ai vérifié plusieurs fois.

    Si vous n'arrivez pas à comprendre la requête voici la structure des tables
    CREATE TABLE `articles` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `titre` varchar(200) NOT NULL,
      `contenu` text NOT NULL,
      `date` datetime NOT NULL,
      `id_auteur` int(11) NOT NULL,
      `supprime` tinyint(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
    
    CREATE TABLE `commentaires` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_news` int(11) NOT NULL,
      `contenu` mediumtext NOT NULL,
      `date` datetime NOT NULL,
      `id_auteur` int(11) NOT NULL,
      `supprime` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
    
    CREATE TABLE `membres` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(100) NOT NULL,
      `id_groupe` int(11) NOT NULL,
      `autoris` int(11) NOT NULL,
      `mail` varchar(150) NOT NULL,
      `envoi_mail` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Autoriser l''envoi d''e-mail',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    
    CREATE TABLE `groupes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `pseudo` varchar(50) NOT NULL,
      `nom` varchar(100) NOT NULL,
      `grade` int(11) NOT NULL,
      `password` varchar(100) NOT NULL,
      `salt` varchar(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    

    Quelqu'un saurait pourquoi ma requête génère une erreur ?

    En vous remerciant d'avance, Minipipo1 :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2010 à 11:10:03

      Alors, pour commencer tu prétends vouloir faire ça sans jointure, et pourtant t'as plein de LEFT JOIN dans ta requête (mais bon, c'est bien els jointures qu'il faut utiliser hein !)

      Ensuite, "FROM articles, commentaires" : fais plutôt "FROM articles LEFT JOIN commentaires ON...". Comme pour les autres jointures quoi.
      • Partager sur Facebook
      • Partager sur Twitter
        21 décembre 2010 à 11:45:36

        Je me suis mal exprimé, en fait les jointures sont juste là pour connaître les noms des auteurs et des groupes, sinon je souhaite obtenir les articles ET les commentaires rangés par date, et pas tous les commentaires.

        En fait le but est d'obtenir toutes les activités sur le "blog", je voudrais faire un genre de système de notification où les articles et les commentaires seraient affichés ensemble.
        • Partager sur Facebook
        • Partager sur Twitter
          21 décembre 2010 à 12:02:55

          OK. Bon, si tu tiens vraiment à la faire en une requête, je peux te conseiller ceci :

          SELECT * FROM (
              SELECT "article" AS type, 
                  articles.id AS id,
                  articles.titre AS contenu,
                  articles.date AS date,
                  articles.supprime AS supprime,
                  NULL AS id_news,
                  membres.nom AS auteur,
                  membres.id AS id_auteur,
                  groupes.nom AS groupe,
                  groupes.id AS id_groupe
              FROM articles
              LEFT JOIN membres ON articles.id_auteur = membres.id
              LEFT JOIN groupes ON membres.id_groupe = groupes.id
              UNION
              SELECT "commentaire" AS type,
                  commentaires.id AS id,
                  commentaires.contenu AS contenu,
                  commentaires.date AS date,
                  NULL AS supprime,
                  commentaires.id_news AS id_news,
                  membres.nom AS auteur,
                  groupes.nom AS groupe,
                  groupes.id AS id_groupe,
                  membres.id AS id_auteur
              FROM commentaires
              LEFT JOIN membres ON commentaires.id_auteur = membres.id
              LEFT JOIN groupes ON membres.id_groupe = groupes.id
              ) AS table_totale
          ORDER BY date DESC;
          


          Si j'ai bien compris ce que tu cherchais à faire...

          En passant, c'est une très mauvaise idée d'appeler un champ "date". C'est un mot réservé !
          • Partager sur Facebook
          • Partager sur Twitter
            21 décembre 2010 à 16:08:46

            Merci beaucoup de ta réponse, ta requête m'a aidé :)

            Citation : Taguan

            En passant, c'est une très mauvaise idée d'appeler un champ "date". C'est un mot réservé !


            Qu'entends-tu par "mot réservé" ? o_O
            • Partager sur Facebook
            • Partager sur Twitter
              21 décembre 2010 à 16:09:44

              Ben c'est un mot-clé de SQL quoi... C'est un type de données dans ce cas là.
              • Partager sur Facebook
              • Partager sur Twitter

              SELECT dans plusieurs tables

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown