0
votes

MySQL / PHP - Sélectionnez une colonne distincte en fonction d'une autre colonne avec la commande et la limite

J'ai une table nommée Messages comme suit: xxx

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:

  • sender_ids distincts dont le récepteur_id est 1 ou récepteur distinct dont Sender_ID est 1
  • en ordre décroissant et limité à 3?

    Le résultat ressemblerait à ceci: xxx

    ou simplement: xxx


4 Réponses :


-1
votes

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


0 commentaires

1
votes

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


1 commentaires

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.



1
votes

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


1 commentaires

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 )



1
votes

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;


3 commentaires

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.