bonjour à tous ! si j'ai un table avec 2 champs, dont les contenus : champ1(marie, maman, marie, moi), le champ2(moi, moi, moi, maman), je narrive pas a realiser une requête dont le sens est : "JE SELECTIONNE TOUS LES VALEURS DANS LE champ1 ET champ2, QUAND LE champ1 OU LE champ2 CONTIENT LA VALEUR moi, EN ENLEVANT LES DOUBLURES, ET EN ENLEVANT AUSSI LA VALEUR moi
j'ai fait :
SELECT DISTINCT champ1, champ2 FROM ma_table WHERE champ1="moi" OR champ2="moi"
mai je n'arrive pas a enlever la valeur "moi" du résultat ! je ne sait pas comment faire, j'ai un petit peu essayer avec MINUS mais je crois que ça ne marche pas
je t'explique, j'essaye de réaliser une chat ou messagerie. Le champ1 c'est le nom l'envoyeur, le champ2 c'est le receveur, le but, c'est d'afficher les noms des personnes qui se sont discuter avec moi. Donc, sur le table, j'ai parlé avec marie et maman, c'est pourquoi le résultat que je viens de te citer ci-dessus! c'est pourquoi je ne veux pas de doublures, ça serait une grande aide si vous avez d'autre façon de realiser cela! est ce que je dois créer d'autres tables ou champs ou...
afficher les noms des personnes qui se sont discuter avec moi
C'est un peu tordu mais je te propose ça :
SELECT DISTINCT Nom
FROM (
-- Messages reçus par moi
SELECT Champ1 AS Nom
FROM maTable
WHERE Champ2 = 'Moi'
UNION
-- Messages envoyés par moi
SELECT Champ2 AS Nom
FROM maTable
WHERE Champ1 = 'Moi'
)
Ou version CASE :
SELECT DISTINCT CASE WHEN Champ1 = 'Moi' THEN Champ2 ELSE Champ1 END AS Nom
FROM maTable
WHERE
Champ2 = 'Moi'
OR Champ1 = 'Moi'
Benzouye, je comprend bien le sens de ton requête, mais je ne sais pas pourqoui ça n'a pas marché pour moi, çà m'a renvoie d'erreur... mais je me suis inspiré de ton requête et à trouvé celui ci qui est tres simplifié etmarche bien :
SELECT DISTINCT receveur AS nom FROM messagerie WHERE envoyeur = 'nantenaina67'
UNION
SELECT DISTINCT envoyeur AS nom FROM messagerie WHERE receveur = 'nantenaina67'
je ne m'en souvien plus... désolé ! mais maintenant, je rencontre encore une nouvelle probleme! encore une fois... je vous explique, supposons champ3 contenant les messages envoyé par maman et moi, comment puis-recuperer chaque dernier message qu'a envoyé chaque utilisateur ou que j'ai envoyé si j'ai parlé avec d'autres personne que mamana? je ne sai
La table messagerie pourrait ne contenir qu'une seule colonne DATETIME au lieu de séparer les deux ... C'est plus pratique à gérer ...
Par ailleurs pourquoi ne pas stocker l'id des utilisateurs (comme clé étrangère) dans la table messagerie au lieu du nom ?
Un modèle plus pertinent serait donc :
CREATE TABLE IF NOT EXISTS `utilisateurs` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL,
`user_pseudo` varchar(255) NOT NULL,
`user_email` varchar(255) NOT NULL,
`user_password` varchar(255) NOT NULL,
`user_avatar` varchar(255) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `messagerie` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message` text NOT NULL,
`id_envoyeur` varchar(255) NOT NULL,
`id_receveur` varchar(255) NOT NULL,
`date_heure_publication` DATETIME NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY ( id_envoyeur ) REFERENCES utilisateurs ( user_id ),
FOREIGN KEY ( id_receveur ) REFERENCES utilisateurs ( user_id ),
) ENGINE=InnoDB;
Ensuite pour récupérer les derniers messages par interlocuteur, il faudra s'appuyer sur le DATETIME maxi.
D'abord on calcule par interlocuteur les DATETIME maxi dans une sous-requête, que l'on utilise pour joindre avec le message et l'afficher.
-- Dernier message reçu par envoyeur
SELECT M.*
FROM
(
-- Date dernier message par envoyeur
SELECT
id_envoyeur,
MAX( date_heure_publication ) AS max_date
FROM messagerie
WHERE id_receveur = 'id utilisateur connecté'
) AS DE
INNER JOIN messagerie M
ON DE.id_envoyeur = M.id_envoyeur
AND DE.max_date = M.date_heure_publication
WHERE M.id_receveur = 'id utilisateur connecté'
UNION
-- Dernier message envoyé par receveur
SELECT M.*
FROM
(
-- Date dernier message par receveur
SELECT
id_receveur,
MAX( date_heure_publication ) AS max_date
FROM messagerie
WHERE id_envoyeur = 'id utilisateur connecté'
) AS DE
INNER JOIN messagerie M
ON DE.id_receveur = M.id_receveur
AND DE.max_date = M.date_heure_publication
WHERE M.id_envoyeur = 'id utilisateur connecté'
De cette manière, tu as le dernier message reçu ET le dernier message envoyé par interlocuteur.
Ce n'est pas tout à fait ce que tu cherches mais on y est presque ... Essaye de terminer
merci beaucoup, je ne suis pas encore fort en requêtes sql, il va d'abord falloir que j'apprennent quelques notions de certains commande de ton requête... je vais y travailler , et essayer de comprendre ! et si je n'y arrive pas, vous me verez encore posté des question...
Bonne journée à vous tous !
excepter une valeur
× 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.