我有两张表格如下
匹配
id (PK)
match_id
name
birthdate
bio
message_long
id (PK)
message
from_id
to_id
match_id (FK to match_on on match table)
unix_timestamp
这两个表负责存储聊天对话日志。我可以通过以下sql查询来检索对话
select * from message_log where match_id = '2434';
我想提出一个sql查询,只有在以下情况下才会返回对话的match_id:
有人可以帮我构建这个SQL查询吗?
答案 0 :(得分:0)
对话中的最后一条消息(收到的最后一条消息) (match_id)[不]来自' 765' (from_id专栏)
似乎是一个简单的查询:
SELECT *
FROM message_log
WHERE match_id = '2434'
AND from_id <> '765'
ORDER BY unix_timestamp DESC NULLS LAST
LIMIT 1;
如果unix_timestamp
可以为NULL,则需要将NULLS LAST
添加到DESC
排序顺序:
另一方面,如果您的意思是仅在最后一条消息不是来自&#39; 765&#39;时返回对话的所有match_id,那么:
SELECT *
FROM message_log
WHERE match_id = '2434'
AND (
SELECT from_id
FROM message_log
WHERE match_id = '2434'
ORDER BY unix_timestamp DESC NULLS LAST
LIMIT 1
) <> '765';
(match_id, unix_timestamp)
甚至(match_id, unix_timestamp, from_id)
上的索引有助于大量查询效果。
除此之外:您所有ID的数据类型varchar(500)
都相当奇怪。您确定这些不仅仅是integer
(或bigint
)吗?
答案 1 :(得分:0)
不确定我是否正确理解了这个问题。据我所知,你需要,
所有匹配ID,其最后一次转换不是来自765。
如果我们考虑样本数据
matchid fromid toid messagetime
2334 600 765 2015-06-17 11:30:36
2334 765 600 2015-06-17 11:30:43
2334 600 765 2015-06-17 11:30:52
2335 600 765 2015-06-17 11:37:44
2335 765 600 2015-06-17 11:37:56
2335 600 765 2015-06-17 11:38:06
2335 765 600 2015-06-17 11:48:03
您希望匹配ID 2334 。由于上次会话来自 765 ,因此应省略匹配ID 2335 。
如果这是您需要的,此查询将获得结果
SELECT resultmatchids FROM
(
SELECT
DISTINCT ON (match_id) match_id,
(CASE WHEN from_id != 765 THEN match_id ELSE NULL END) AS resultmatchids
FROM match
ORDER BY match_id, unix_timestamp DESC
) AS recentmatch
WHERE recentmatch.resultmatchids IS NOT NULL