User Tools

Site Tools


adv_sample_user_queries_plus

Advanced examples of SQL queries

Messages sent, with senders or recipients from a specific domain, but not tagged with a specified tag:

SELECT m.mail_id FROM mail m
JOIN mail_addresses ma ON (ma.mail_id=m.mail_id)
JOIN addresses USING(addr_id)
WHERE status&256<>0
AND email_addr LIKE '%@example.org'
AND NOT EXISTS
  (SELECT 1 FROM mail_tags mt JOIN (SELECT tag_id FROM tags WHERE name='Sample Tag') t ON (t.tag_id=mt.tag) WHERE mt.mail_id=m.mail_id)
;

Latest outgoing message per distinct recipient (to which a message was ever addressed):

SELECT mail_id FROM (SELECT DISTINCT ON (m1.addr_id) m.mail_id,m1.addr_id
 FROM mail_addresses m1 JOIN mail m USING(mail_id)
  WHERE m1.addr_type=2 AND m.status&129=129
  ORDER BY m1.addr_id,m.msg_date DESC) s

Old messages, not archived or trashed, that belong to a thread whose most recent message is older than one month:

SELECT mail_id FROM mail m
WHERE status&32=0 AND status&16 -- intentionally split to benefit from the index on mail.status&32=0
AND msg_date<now()-'1 month'::INTERVAL
AND thread_id IS NOT NULL
AND NOT EXISTS
 (SELECT 1 FROM mail m2
  WHERE m2.thread_id=m.thread_id
    AND m2.msg_date>now()-'1 month'::INTERVAL)

Messages from the thread with the most unprocessed messages

SELECT mail_id FROM mail WHERE thread_id IN
(SELECT thread_id
  FROM mail
   WHERE status&32=0 AND status&16=0
     AND thread_id IS NOT NULL
   GROUP BY thread_id
   ORDER BY COUNT(*) DESC
   LIMIT 1
)

See the database schema documentation for definitions of tables and columns.

adv_sample_user_queries_plus.txt · Last modified: 2021/05/15 12:21 by daniel