Bonjour,
Je te fais une lecture de ta table et de ta requête et toi tu me diras si ce que j'ai compris est bien ce que tu veux.
Lecture de la table selon moi:
Code : Tout sélectionner
CREATE TABLE `forum_alertes` (
`id` mediumint(11) NOT NULL auto_increment,
`idtopic` int(11) NOT NULL default '0',
`title` varchar(255) collate latin1_german2_ci NOT NULL default '',
`contenu` text collate latin1_german2_ci NOT NULL,
`user_id` int(11) NOT NULL default '0',
`status` tinyint(2) NOT NULL default '0',
`idmodo` int(11) NOT NULL default '0',
`timestamp` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `idtopic` (`idtopic`,`user_id`,`idmodo`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=6 ;
Cette table forum_alertes enregistre vraisemblablement des messages d'alertes identifiés par un id unique et incrémentiel dans le temps.
- Toute alerte est définie par un titre (title), un message (contenu), un état (status) et une date (timestamp)
Toute alerte concerne un et un seul sujet (idtopic)
Toute alerte concerne aussi un et un seule utilisateur (user_id)
Toute alerte est suivie par un et un seul modérateur (idmodo)
La table a un index unique (clé primaire) qui est id et un index de recherche formé de idtopic, user_id et idmodo.
Quant à la requête de sélection:
$result = mysql_query('SELECT fa.id, fa.title, fa.timestamp, fa.status, fa.user_id, fa.idtopic, fa.idmodo, m2.pseudo AS pseudo_modo, m.pseudo, t.topic_titre AS topic_titre
FROM forum_alertes AS fa
LEFT JOIN forum_topic AS t ON t.topic_id = fa.idtopic
LEFT JOIN membres AS m ON m.id = fa.user_id
LEFT JOIN membres AS m2 ON m2.id = fa.idmodo
ORDER BY fa.status ASC, fa.timestamp DESC') or die (mysql_error());
Elle extrait les informations concernant l'alerte (fa) : id, title, timestamp, status, user_id, idtopic et idmodo
Elle effectue une liaison entre la table forum_alerte et plusieurs autres tables liées à elle par des clés étrangères. Où chaque clé étrangère relie une table spécifique:
- idtopic relie la table forum_topic (t) pour accèder à topic_titre
user_id relie la table membres (m) pour atteindre le pseudo de l'utilisateur
idmodo relie aussi la table membres (m2) pour accèder au pseudo du modérateur
Les liaisons sont formulées comme des jointures externes à gauche (ouvertes vers la table forum_alerte) pour inclure les alertes qui n'ont pas forcement de sujet, d'utilisateur ou de modo connus.
Et finalement la sélection trouvé est classée par ordre croissant des états d'alertes et par ordre décroissant du temps (de la plus récentes à la plus ancienne par état)
Au vu de la syntaxe est du rendu de cette requête testée sous Mysql, elle est correcte et retourne exactement ce que mon analyse a formulé.
Les éléments du test sont les suivants:
Code : Tout sélectionner
-- phpMyAdmin SQL Dump
-- version 2.10.1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mar 04 Septembre 2007 à 14:52
-- Version du serveur: 5.0.41
-- Version de PHP: 5.2.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `forum_alertes`
--
CREATE TABLE `forum_alertes` (
`id` mediumint(11) NOT NULL auto_increment,
`idtopic` int(11) NOT NULL default '0',
`title` varchar(255) collate latin1_german2_ci NOT NULL default '',
`contenu` text collate latin1_german2_ci NOT NULL,
`user_id` int(11) NOT NULL default '0',
`status` tinyint(2) NOT NULL default '0',
`idmodo` int(11) NOT NULL default '0',
`timestamp` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `idtopic` (`idtopic`,`user_id`,`idmodo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=8 ;
--
-- Contenu de la table `forum_alertes`
--
INSERT INTO `forum_alertes` (`id`, `idtopic`, `title`, `contenu`, `user_id`, `status`, `idmodo`, `timestamp`) VALUES
(6, 1, 'a1', 'a1', 0, 1, 0, 4),
(7, 2, 'a2', 'a2', 1, 1, 1, 1);
-- --------------------------------------------------------
--
-- Structure de la table `forum_topic`
--
CREATE TABLE `forum_topic` (
`topic_id` mediumint(11) NOT NULL auto_increment,
`topic_titre` varchar(255) collate latin1_german2_ci NOT NULL default '',
PRIMARY KEY (`topic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=2 ;
--
-- Contenu de la table `forum_topic`
--
INSERT INTO `forum_topic` (`topic_id`, `topic_titre`) VALUES
(1, 't1');
-- --------------------------------------------------------
--
-- Structure de la table `membres`
--
CREATE TABLE `membres` (
`id` mediumint(11) NOT NULL auto_increment,
`pseudo` varchar(255) collate latin1_german2_ci NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=3 ;
--
-- Contenu de la table `membres`
--
INSERT INTO `membres` (`id`, `pseudo`) VALUES
(1, 'u1'),
(2, 'modo1');
--
-- Requête testée
--
SELECT fa.id, fa.title, fa.timestamp, fa.status, fa.user_id, fa.idtopic, fa.idmodo, m2.pseudo AS pseudo_modo, m.pseudo, t.topic_titre AS topic_titre
FROM forum_alertes AS fa
LEFT JOIN forum_topic AS t ON t.topic_id = fa.idtopic
LEFT JOIN membres AS m ON m.id = fa.user_id
LEFT JOIN membres AS m2 ON m2.id = fa.idmodo
ORDER BY fa.status ASC , fa.timestamp DESC
Résultat du test:
Code : Tout sélectionner
id title timestamp status user_id idtopic idmodo pseudo_modo pseudo topic_titre
6 a1 4 1 0 1 0 NULL NULL t1
7 a2 1 1 1 2 1 u1 u1 NULL
Remarque: C'est normal d'avoir des null, car le test illustre exprès les cas de jointures à gauche (LEFT JOIN)