2016-12-09 2 views
0

У меня есть следующая таблица, которая используется для автоответчика, отслеживает все сообщения, обменянные на каждого человека. Он отслеживает каждое лицо по match_idсложный sql-запрос, объединяющий 'select max' и select count (*) запросы

CREATE TABLE public.sms_log 
(
    id bigint NOT NULL DEFAULT nextval('sms_log_id_seq'::regclass), 
    source text NOT NULL, 
    destination text NOT NULL, 
    message text, 
    insert_time timestamp with time zone DEFAULT now(), 
    reply_batch boolean DEFAULT false, 
    own_reply boolean DEFAULT false, 
    match_id text NOT NULL, 
    CONSTRAINT sms_log_pkey PRIMARY KEY (id), 
    CONSTRAINT sms_log_match_id_fkey FOREIGN KEY (match_id) 
     REFERENCES public.match (match_id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE 
) 

Сейчас у меня есть следующий запрос, который возвращает строку match_id, если последнее сообщение отправлены было own_reply, как ложные. (В значительной степени проверяет, кто послал систему сообщение от последнего времени система ответила на них)

QUERY

select m.* 
from sms_log m 
where m.source <> 'MYNUMBER' 
    and m.destination = 'MYNUMBER' 
    and m.insert_time = (select max(insert_time) 
         from sms_log 
         where match_id = m.match_id 
         group by match_id) 

Затем я использую петлю внутри программы, чтобы определить, сколько раз программа имеет ответил на match_id, используя следующий запрос

QUERY B

select count(*) from sms_log where match_id = ? and reply_batch = true 

можно ли объединить эти два запроса таким образом, что QU ERY A вернет match_ids только в том случае, если счетчик answer_batch меньше 3?

+0

Просьба представить некоторые выборочные данные и ожидаемые данные. – Viki888

ответ

1

Вы можете попробовать это:

select m.* 
from sms_log m 
where m.source <> 'MYNUMBER' 
    and m.destination = 'MYNUMBER' 
    and m.insert_time = 
     (select max(insert_time) 
     from sms_log 
     where match_id = m.match_id group by match_id) 
    and (select count(*) 
     from sms_log as sl 
     where sl.match_id = m.match_id 
     and sl.reply_batch = true) < 3