组合MySQL表并包含时间戳最短的记录

时间:2014-09-02 15:07:16

标签: mysql join timestamp aggregate-functions

我有三个表:'user','user_packages'和'subscription'。第一个包含用户信息,第二个包含用户感兴趣的包ID(user_packages.user = user.ID),第三个包含用户的所有包订阅。 (subscription.user = user.ID,subscription.package = user_packages.package)。

我在第一个表上进行查询,例如纽约市的所有用户。我想与包表进行连接以获取用户包,这没问题。但是,我还想包含实际的订阅,这意味着end_date = 0(订阅尚未结束)。

所需的最终结果是纽约所有用户的列表,可以查看是否是订阅者。如果用户没有订阅,则仍然应该返回。

我目前的查询如下:

SELECT user.*, sub.user AS subscriber, sub.end_date, userp.package FROM user 
LEFT OUTER JOIN user_packages userp ON userp.user = user.ID
LEFT OUTER JOIN subscription sub ON sub.user = user.ID
WHERE user.city = 'New York' 
GROUP BY user.ID
ORDER BY ID

它将返回纽约的所有用户,如果“subscriber”不是NULL,则该用户是订阅者。到目前为止一切顺利,但“订户”也将为前订户设置(end_date> 0)。如果end_date> 0然后必须有一些方法来发现它不是订户。

要考虑的事情:

  • 如果我包含“WHERE(end_date IS NULL或end_date = 0)”,那么它将不会返回已结束订阅且没有活动订阅的用户
  • 如果用户同时拥有活动订阅和已结束订阅,则应采用活动订阅,而不是首先遇到的行(因为这可能是已结束的行)

感谢任何帮助!

[编辑]

以下是具有一些样本记录和期望结果的特定表格,以使其更易于理解。

user:                                      user_packages:
---------------------------------------    -------------------------
|  ID  |  Name    |   ...  |   City   |    |  ID  | user | package |
---------------------------------------    -------------------------
| 101  |  User A  |   ...  | New York |    |  23  | 101  |   1     |
| 102  |  User B  |   ...  | New York |    |  24  | 101  |   2     |
| 103  |  User C  |   ...  | Miami    |    |  25  | 102  |   1     |
| 104  |  User D  |   ...  | New York |    |  26  | 104  |   1     | 
---------------------------------------    -------------------------

subscriptions:
------------------------------------------------------ 
|  ID  |  user    | package | start_date | end_date   |
------------------------------------------------------ 
|  5   |  101     |   1     | 2014-05-01 | 0000-00-00 |
|  6   |  101     |   2     | 2014-06-09 | 2014-08-31 |
|  7   |  102     |   1     | 2014-06-15 | 0000-00-00 |   
|  8   |  104     |   1     | 2014-07-02 | 2014-08-02 |
-------------------------------------------------------

Desired end result:
------------------------------------------------------
|  ID  |  Name    |   ...  |   City   |  subscriber  |
------------------------------------------------------
| 101  |  User A  |   ...  | New York |    101       |
| 102  |  User B  |   ...  | New York |    102       |
| 104  |  User D  |   ...  | New York |    NULL      | 
------------------------------------------------------ 

用户A有一个有效订阅和一个已结束订阅,因此订阅者。

用户B有一个有效和无结束的订阅,因此订阅者。

用户C不在纽约,因此未显示在结果中。

用户D没有有效和一个已结束的订阅,因此不是订阅者。

我希望这会把它搞清楚一点!

0 个答案:

没有答案