返回id,其中两个字段中的一个匹配一个值,但只返回该值以外的字段

时间:2013-08-23 19:11:57

标签: mysql sql

我有一个消息表,其中包含给定消息的to_idfrom_id

我想将user_id传递给此查询并让它返回一个非重复的id列表,表示向所提供的user_id发送消息的所有用户。

我现在拥有的是(使用12作为目标user_id):

SELECT from_id, to_id

FROM messages

WHERE 
from_id = 12 
OR 
to_id = 12

这确实返回了user_id存在的所有记录,但是我不确定如何让它只返回非重复项,并且只有一个字段是user_id而不是12。

简而言之,它将返回用户12具有现有消息记录的任何用户的id。

我希望我已经解释得这么好了,我不得不相信我还没有学到它相对简单。

编辑:

我应该指定虽然我当前的SQL有两个字段,但我只想返回一个字段--- contact_id。并且应该没有重复。

contact_id不是消息表中的字段,但这是我想要返回的查询的字段名称,无论它是返回from_id还是to_id

3 个答案:

答案 0 :(得分:1)

这是一个避免联合声明的解决方案。

SELECT distinct (case when to_id = 12 then from_id else to_id end) as contact_id

FROM messages

WHERE 
   from_id = 12 
OR 
    to_id = 12

答案 1 :(得分:1)

您可以使用union

select
 from_id as contact_id
from messages
where to_id = 12
union
select
 to_id
from messages
where from_id = 12

此外,来自the documentation(强调我的):

  

UNION的默认行为是从结果中删除重复行

或者,您可以使用if()(或case):

select distinct
 if(from_id = 12, to_id, from_id) as contact_id
from messages
where from_id = 12
or to_id = 12

答案 2 :(得分:0)

您需要UNION两个查询。