我想基于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
但我不想要消息ID 5,因为它已经出现在message_from之前,而message_to已经出现在message_id = 4
我想要基于bidpost_id,message_from和message_to
的明确价值注意:message_from和message_to对必须是唯一的
答案 0 :(得分:3)
您可以使用join
或exists
执行此操作。例如:
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,我从另一篇文章的答案中提取了一些代码