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 ?
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.
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.
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é !
× 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.
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !