mysql中多个值的不同值

时间:2015-10-28 14:16:08

标签: mysql

我想基于3列找到不同的值。这是我正在尝试的查询

select * from messages where (message_from=4 or message_to=4) group by message_from,message_to,bidpost_id
ORDER BY `messages`.`message_id` ASC

给出了以下输出:
enter image description here

但我不想要消息ID 5,因为它已经出现在message_from之前,而message_to已经出现在message_id = 4

我想要基于bidpost_id,message_from和message_to

的明确价值

注意:message_from和message_to对必须是唯一的

我理想的输出是:
enter image description here

2 个答案:

答案 0 :(得分:3)

您可以使用joinexists执行此操作。例如:

select m.*
from messages m
where not exists (select 1
                  from messages m2
                  where m2.bidpost_id = m.bidpost_id and
                        m2.message_from in (m.message_to, m.message_from) and
                        m2.message_to in (m.message_to, m.message_from) and
                        m2.message_id < m.message_id
                 );

这将返回这三列的第一条消息(基于message_id)。

另一种不使用显式连接的方法是:

select m.*
from messages m
where m.message_id in (select min(m.message_id)
                       from messages m
                       group by bidpost_id,
                                least(message_from, message_to),
                                greatest(message_from, message_to)
                      );

即使使用messages(bidpost_id, message_from, message_to, message_id)上建议的索引,效果也可能不如此好。

答案 1 :(得分:0)

我完成了这个解决方案:

select message_id, value1, value2, bidpost_id from (select message_id, `bidpost_id`, 
least(`message_from`, `message_to`) as value1
, greatest(`message_from`, `message_to`) as value2
from `messages` group by value1, value2, bidpost_id order by message_id) as t where value1= 4 or value2 =4

感谢Gordon Linoff,我从另一篇文章的答案中提取了一些代码