sql语句根据where子句

时间:2015-06-17 03:45:09

标签: sql postgresql

我有两张表格如下

匹配

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

enter image description here

enter image description here

这两个表负责存储聊天对话日志。我可以通过以下sql查询来检索对话

select * from message_log where match_id = '2434';

我想提出一个sql查询,只有在以下情况下才会返回对话的match_id:

  • 对话中的最后一条消息(收到的最后一条消息)(match_id)不是来自'765'(from_id列)

有人可以帮我构建这个SQL查询吗?

2 个答案:

答案 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