MySQL限制在第二个表

时间:2014-08-17 14:59:36

标签: mysql join limit

我有一个包含运行这些事件的事件和组织的数据库。我希望创建一个查询,显示在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天或更早,仅包括该事件?

2 个答案:

答案 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是“正交的”,即您可以将查询嵌入到其他查询中。