我有三个表:'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然后必须有一些方法来发现它不是订户。
要考虑的事情:
感谢任何帮助!
[编辑]
以下是具有一些样本记录和期望结果的特定表格,以使其更易于理解。
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没有有效和一个已结束的订阅,因此不是订阅者。
我希望这会把它搞清楚一点!