J'ai une table nommée Messages B> comme suit: Comment puis-je sélectionner les 3 derniers utilisateurs uniques qui ont communiqué avec l'utilisateur 1?
En d'autres termes, comment puis-je sélectionner: p> Le résultat ressemblerait à ceci: p> ou simplement: p>
4 Réponses :
Sélectionnez ID, Sender_ID, récepteur_ID à partir de messages où Sender_Id = 1 ou récepteur_Id = 1 commande par ID descension de la limite 3 p>
Je n'ai pas vu votre partie distincte de la question. Ici vous allez:
SELECT id, sender_id, receiver_id FROM messages t1, (SELECT max(id) maxid, if(sender_id=1,receiver_id,sender_id) other FROM messages WHERE sender_id=1 OR receiver_id=1 GROUP BY other ) t2 WHERE t1.id=t2.maxid ORDER BY id DESC LIMIT 3
Bon! Assez simple. Avec cette approche, est-il possible pour la sortie Sender_ids / Receiver_ids dans une colonne, E.G., user_id? Et comment d'autres colonnes peuvent-elles être incluses dans la sortie? Comme: id, user_id, message, horodatage.
Vous pouvez essayer quelque chose comme ceci:
SELECT id,sender_id,receiver_id, IF(sender_id =1, receiver_id,sender_id) as t FROM `messages` where 1 IN (sender_id,receiver_id) GROUP by t order by id desc
Merci pour votre réponse. Une idée pourquoi elle jette l'erreur suivante? ERREUR: ER_WRONG_FIELD_WITH_GROUP: l'expression n ° 1 de la liste de sélection n'est pas en groupe par clause et contient la colonne non contenue 'tester.messages.id' qui ne dépend de manière non fonctionnelle des colonnes du groupe par clause; Ceci est incompatible avec sql_mode = seulement_full_group_by ( db-fiddle.com )
Quelque chose comme ça devrait fonctionner:
SELECT r_s_id FROM (SELECT MAX(id) Max_ID, CASE WHEN sender_id=1 THEN receiver_id WHEN receiver_id=1 THEN sender_id END AS r_s_id FROM messages GROUP BY r_s_id HAVING r_s_id IS NOT NULL ORDER BY Max_ID DESC LIMIT 3) SQ;
Travaillé comme un charme! Et assez compréhensible. Nice comment il génère l'identifiant comme max_id et l'expéditeur_ids / récepteur_ids comme r_s_id. Et si je veux inclure d'autres colonnes dans la sortie? Exemple: max_id, r_s_id, message, horodatage.
C'est une autre chose à considérer @amatek .. Parce que vous pourriez avoir besoin d'une autre sous-requête pour correspondre au message et à l'horodatage. Je peux vous aider avec cela, mais vous devez construire un exemple de schéma complet (structures de table requises et 10 à 20 rangs d'échantillon de données) dans dB-violon. Une fois que vous avez fait cela, s'il vous plaît Modifiez votre question pour inclure le lien DB-Fiddle. Merci
Merci beaucoup, @ tcadidot0 ... Votre réponse m'a beaucoup aidé avec mon projet en cours. J'aimerais pouvoir vous contacter à l'avenir.
Voir meta.stackoverflow.com/questions/333952/...