我有一个包含运行这些事件的事件和组织的数据库。我希望创建一个查询,显示在90天或更长时间内未创建事件的任何组织。
到目前为止,我有这个问题:
SELECT organizations.name, organizations.first_name, organizations.last_name,
organizations.email, events.created_at, events.start_date, events.end_date
FROM events
INNER JOIN organizations ON events.organizer_id = organizations.id
WHERE DATE_SUB(CURDATE(),INTERVAL 90 DAY) > events.created_at
GROUP BY events.organizer_id
ORDER BY events.created_at DESC
问题是,这只会选择任何超过90天的事件,而不是最新事件。如何让查询使用最新的created_at查看事件,并查看是否为90天或更早,仅包括该事件?
答案 0 :(得分:3)
您可以使用聚合。如果您关心组织,那么您在event
中不需要select
个信息:
SELECT o.name, o.first_name, o.last_name, o.email
FROM events e INNER JOIN
organizations o
ON e.organizer_id = o.id
GROUP BY o.id
HAVING DATE_SUB(CURDATE(), INTERVAL 90 DAY) > MAX(e.created_at)
ORDER BY MAX(e.created_at) DESC;
此查询不会选择从不拥有事件的组织。为此,您需要left outer join
。这是一种方式:
SELECT o.name, o.first_name, o.last_name, o.email
FROM organizations o LEFT JOIN
events e
ON e.organizer_id = o.id AND
e.created_at >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
WHERE e.organizer_id is null
GROUP BY o.id
ORDER BY MAX(e.created_at) DESC;
请注意,我还将查询更改为使用表别名。这些使查询更容易编写和阅读。
答案 1 :(得分:0)
试试这个:
首先创建一个查询(此处称之为“A”),选择在过去90天内创建事件的所有组织。
SELECT organizer_id from events where DATE_SUB(CURDATE(),INTERVAL 90 DAY) <= events.created_at
然后编写一个查询,列出所有不在查询A的结果集中的组织:
SELECT * from organizations where id not in (A)
这使得:
SELECT * from organizations where id not in (SELECT organizer_id from events where DATE_SUB(CURDATE(),INTERVAL 90 DAY) <= events.created_at)
这是因为SQL是“正交的”,即您可以将查询嵌入到其他查询中。