MySQL一对多,没有具体的条目

时间:2015-01-28 11:26:12

标签: mysql left-join

我确信我的标题还有很多不足之处,但让我试着解释一下这个问题。

我有一个像这样的表格帐户:

+----------+-----------+-----------+
|    id    |   name    |   email   |
+----------+-----------+-----------+
|     1    |   Bob     |bob@bob.com|
+----------+-----------+-----------+

我有一个像这样的包表:

+----------+-----------+-----------+--------+--------+
|    id    |package_id | start_date|end_date| acc_id |
+----------+-----------+-----------+--------+--------+
|     1    |   15      |2014-01-01 |        |  1     |
+----------+-----------+-----------+--------+--------+

一个帐户可以有多个包,但它们不会有相同的包,即package_id为15的两个活动包。

我需要有效地选择所有没有活动包的帐户,其package_id为15或25.我使用以下内容确定包是否处于活动状态:

p.start_date >= NOW() and p.end_date <= NOW() or p.end_date = '0000-00-00' or ISNULL(p.end_date)))

我已经看到我可以说在查询中有第二个选择,指定选择一个名称,然后使用此值进行比较。例如,

(select * from packages as p where p.start_date >= NOW() and p.end_date <= NOW() or p.end_date = '0000-00-00' or ISNULL(p.end_date))) AND acc_id = accounts.id AND package_id IN(15,25)) AS has_package

我可以这么说:

has_package <= 0

所以我正在寻找类似的东西,其中帐户ID是当前的记录ID:

SELECT * 
FROM accounts AS a
WHERE (select * from packages as p where p.start_date >= NOW() and p.end_date <= NOW() or p.end_date = '0000-00-00' or ISNULL(p.end_date))) AND p.acc_id = a.id AND package_id IN(15,25)) <= 0

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要在子查询中使用group by子句,如下所示:

SELECT * 从账户AS a WHERE(从包中选择*作为p,其中p.start_date&gt; = NOW()和p.end_date&lt; = NOW()或p.end_date ='0000-00-00'或ISNULL(p.end_date)))AND p.acc_id = a.id AND package_id IN(15,25)GROUP BY package_id有count(package_id)= 1)