从多列中获取不同的值(包括连接)

时间:2011-11-01 11:18:01

标签: mysql distinct

这个让我难过。

快速概述

我需要能够获取参与消息线索的人的所有电子邮件地址。人们可以通过几种不同的方式向此messageThread添加消息,并且由于人们可以是发件人或接收消息,因此电子邮件地址可能位于不同的列中。

这是一个示例表。

messagesTable

ID | threadKey |  fromEmail   |  toEmail    | sentBy   |   sentTo
1  | ASJHD2    | me@exam.com  | you@bob.com |  null    |   null
2  | ASJHD2    | jake@k.com   |             |  null    |   null
3  | ASJHD2    |              |             |  55      |   88

我也有Users表。

   ID   | username  | email
   55   | Ike       | ike@domain.com
   88   | Sam       | sam@j.com

现在可以使用ASJHD2的threadKey获取参与该消息的所有不同电子邮件。请记住,还需要在users表上进行连接。

3 个答案:

答案 0 :(得分:2)

首先尝试只收取

等电子邮件
SELECT fromEmail
FROM messagesTable
WHERE fromEmail IS NOT NULL
UNION
SELECT toEmail
FROM messagesTable
WHERE toEmail IS NOT NULL

答案 1 :(得分:0)

您需要做的是基本上加入您的用户表,但说明使用任一字段进行连接的条件。然后,根据您要查找的电子邮件地址对结果进行分组。

SELECT * FROM messagesTable AS m
JOIN Users AS u ON u.email = m.fromEmail OR u.email = m.toEmail
WHERE m.threadKey = 'ASJHD2'
GROUP BY u.email;

答案 2 :(得分:0)

只为有兴趣的人。我使用Max回答并添加了Join。这是我最终的最终查询。

SELECT fromEmail as email FROM messages m WHERE fromEmail IS NOT NULL and m.threadKey = "86ec8125-988d-478f-8b1c-8c1a7c3056f5"
UNION SELECT toEmail FROM messages m WHERE toEmail IS NOT NULL and m.threadKey = "86ec8125-988d-478f-8b1c-8c1a7c3056f5"
UNION SELECT email  from messages m JOIN acl_users on sentBy =  acl_users.id where m.threadKey = "86ec8125-988d-478f-8b1c-8c1a7c3056f5"
UNION SELECT email  from messages m JOIN acl_users on sentTo =  acl_users.id where m.threadKey = "86ec8125-988d-478f-8b1c-8c1a7c3056f5"