从MYSQL中的两列中选择不同的数据

时间:2012-12-18 09:15:54

标签: mysql select multiple-columns

我有一个表格,其中包含用户之间的消息列表。表结构:

Receiver | Sender | Subject   | Message

Daniel   | Admin  | Title 1   | Message 1
Admin    | Daniel | Title 2   | Message 2
Daniel   | Admin  | Title 3   | Message 3
Daniel   | John   | Title 4   | Message 4

假设我以Daniel身份登录。我想显示与我通信的人员列表(无论我是发送者还是接收者),以及最新的主题/消息。类似的东西:

Admin | Title 3 | Message 3
John  | Title 4 | Message 4

我已经尝试了一百万种方法来做到这一点,但我无法用手指做它!

如果有人可以帮助我区分我是发送者的最新消息和我是接收者的消息(例如,某种if语句),也会有所帮助。但是,我还没有尝试过这个,所以这不是一个紧迫的问题。

非常感谢任何帮助:)

4 个答案:

答案 0 :(得分:0)

SELECT Receiver, Subject, Message FROM m WHERE Sender='<your_name>'
UNION ALL
SELECT Sender, Subject, Message FROM m WHERE Receiver='<your_name>'

这将只返回与给定名称联系的名称列表。您可以操纵此代码以返回它是发件人还是接收者

修改 (在交换评论后)

这将显示每个对话的最后一条消息,无论您正在寻找的人是发件人还是收件人。代码基于我的临时表,您必须稍微调整一下以满足您的需求。

SELECT MAX(id), conv, message FROM (
  SELECT id , CONCAT(sender,'-',receiver) AS 'conversation', message FROM t
  WHERE
    sender = '<person>'
  GROUP BY rec
  UNION
  SELECT id , CONCAT(rec,'-',sender) AS 'conversation', message FROM t
  WHERE
    rec = '<person>'
  GROUP BY sender
) as t
GROUP BY convsersation, message

说明

  1. 在第一个子查询中,我收到的每个对话的最新消息是您要找的人是发件人。

  2. 第二个子查询为我们提供了该人作为接收者的对话的最新消息的结果。

  3. 使用了CONCAT,因此我们可以将对话合并在一起

  4. 我们将它包装在只输出MAX(id)的主查询中,这是最新消息。

  5. 如果您需要知道相关人员是接收者还是发件人,您可以在子查询中添加另一列:

    SELECT MAX(id),对话,消息,类型FROM(   SELECT id,CONCAT(发件人,&#39; - &#39;,接收者)AS&#39;会话&#39;,邮件,&#39;发件人&#39; AS&#39;类型&#39;从T   哪里     sender =&#39;&#39;   GROUP BY rec   联盟   SELECT id,CONCAT(rec,&#39; - &#39;,sender)AS&#39; conversation&#39;,message,&#39; receiver&#39; AS&#39;类型&#39;从T   哪里     rec =&#39;&#39;   GROUP BY发件人 )作为t GROUP BY convsersation

  6. (出于某种原因,我无法在第二个查询中创建代码块,有人可以编辑它)

答案 1 :(得分:0)

获取您指定的输出....

SELECT i.correspondent, m.subject, i.msg
FROM (
SELECT sender AS correspondent, MAX(message) msg
FROM mesages
WHERE receiver='Daniel'
GROUP BY sender
UNION
SELECT receiver AS correspondent, MAX(message)
FROM mesages
WHERE sender='Daniel'
GROUP BY receiver )i,
messages m
WHERE i.msg=m.message;

但是还有很多方法可以获得通讯员名单。

答案 2 :(得分:0)

尝试此查询

SELECT Receiver, Subject, Message ,'Sender' as 'type' FROM m WHERE Sender='Danial'
UNION ALL
SELECT Sender, Subject, Message ,'Reciever' as 'type'  FROM m WHERE Receiver='Danial'

编辑:

(SELECT Receiver, Subject, Message ,'Sender' as 'type' FROM m WHERE Sender='Danial' ORDER By message desc limit 1)
UNION ALL
(SELECT Sender, Subject, Message ,'Reciever' as 'type'  FROM m WHERE Receiver='Danial'ORDER By message desc limit 1)

答案 3 :(得分:0)

SELECT Receiver, Subject, Message 
FROM Messages 
WHERE Sender='Daniel'
UNION
SELECT Sender, Subject, Message
FROM Messages
WHERE Receiver='Daniel';

这将返回'Daniel'发送和接收的所有消息。要对此进行扩展并指定哪些记录是发送或接收的消息,您可以将代码修改为以下内容,0表示已发送消息,1表示已接收消息:

SELECT Receiver, Subject, Message, 0 AS 'MessageType'
FROM Messages 
WHERE Sender='Daniel'
UNION
SELECT Sender, Subject, Message, 1 AS 'MessageType'
FROM Messages
WHERE Receiver='Daniel';

然后,当您返回数据时,您可以根据0/1值将其分为两组。

我还建议您创建一个包含用户的表格,以便在您的“信息”表格中,您可以按照ID而不是按名称来引用它们。