2013-08-23 64 views
2

我有一个消息表,该消息表既有to_id也有from_id给定的消息。返回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存在的所有记录,但我不知道如何让它只返回非重复,并且只有一个字段将是不是12的user_id。

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

我希望我已经解释得很清楚了,我必须相信我还没有学到相对简单。

编辑:

我应该规定,虽然我目前的SQL有两个领域,我想返回只有一个字段--- CONTACT_ID。并且不应该有重复。

CONTACT_ID不是在消息表中的字段,但是这是字段名,我想查询返回,而不管其是否返回from_id或to_id

回答

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(重点煤矿):

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

或者,你可以使用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
+0

此查询似乎总是返回from_id,在某些情况下,它是12.我希望它只返回一个名为contact_id的字段。 – prototypical

+0

您是否确实有任何符合第二个查询条件的数据,即:'where from_id = 12'? – canon

+0

是的,但我看到的问题是,有些消息是从相同的ID发送的。所以我需要处理。 – prototypical

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 
+0

没关系,这将返回记录,但有重复。另外理想情况下,它会返回一个只有一个字段的查询 - 比如contact_id。我会在我的问题中补充一点,我不认为我很清楚,因为我希望回到一个领域。 – prototypical

+0

当我使用distinct关键字时,我不会重复。 – dcaswell

+0

是的,我很抱歉,我没有意识到,有一个记录,其中to_id和from_id匹配,这使得我相信这发生了。 – prototypical

0

你需要UNION两个查询。

相关问题