使用用户子类别限制MySQL中结果的最佳方法

使用用户子类别限制MySQL中结果的最佳方法,mysql,Mysql,我试图从本质上解决以下问题: SELECT * FROM users a JOIN plans b ON (a.userID = b.userID) WHERE b.plan = 1 AND b.status = 1 1查找系统中只有programID 1的所有用户 2查找系统中具有programID 1和任何其他活动程序的所有用户 我的表格结构非常简单,如下所示: 使用者 计划 我知道我可以很容易地找到所有有如下特定计划的成员: SELECT * FROM users a JOIN plan

我试图从本质上解决以下问题:

SELECT * FROM users a JOIN plans b ON (a.userID = b.userID) WHERE b.plan = 1 AND b.status = 1
1查找系统中只有programID 1的所有用户

2查找系统中具有programID 1和任何其他活动程序的所有用户

我的表格结构非常简单,如下所示:

使用者 计划 我知道我可以很容易地找到所有有如下特定计划的成员:

SELECT * FROM users a JOIN plans b ON (a.userID = b.userID) WHERE b.plan = 1 AND b.status = 1
但这只会告诉我哪些用户有“活动”计划1

我如何知道谁只有计划1?在本例中,只有userID 5?如何知道谁有计划1和任何其他活动计划


更新:这不是为了获得计数,我实际上需要原始成员信息,包括他们拥有的所有计划,因此计数*响应可能不是我想要实现的。

好的…,您已经提到,您不想要特定用户持有的其他计划的计数,但根据您的要求,您可以获得如下最佳输出:

有这么多用户的计划1处于活动状态,这是他已排除计划1的其他活动计划的计数

SELECT u.userID,
   u.Name,
   p.Id AS Plan1ActiveId,
   (SELECT COUNT(*) FROM plans sub where sub.userID = u.userID and sub.plan <> 1 and sub.status = 1) AS OtherActivePlanCount
FROM users u JOIN plans p ON (u.userID = p.userID) 
where p.plan = 1 AND p.status = 1;

或者,如果您想向下钻取计划的详细信息,则需要应用第二个查询,以获取其他计划的详细信息。

您可以使用COUNT,并结合GROUP BY和HAVING子句

例如:

从用户a中选择*加入a.userID=b.userID组上的计划b,加入的b.user\u ID的计数*为1,b.plan=1


这将按用户id对行进行分组,并且只包括count=1的行。在计划表中只有一行。注意-我最终简化了我头脑中的整体概念。我只是从所有我知道有我想要的目标计划的成员中进行了一次再选择。然后,我对所有计划进行了总体选择,这些成员的ID要么在已知ID的子选择中,要么不在其中


经过测试,这比建议的资源密集度要低得多,使用起来也更简单,但非常感谢您的帮助。

这不会显示会员拥有的所有计划-只有会员本人和返回时的一个计划。如果您想要的用户只有计划1,他只有1个计划。您的查询将为有9个计划的成员显示一个行项目,而不会告诉我该成员有哪些计划。这是您关于查找只有计划1的用户的问题的查询。所以用户不能有9个计划。这将返回具有计划1且仅具有计划1的用户。如果您需要具有计划1和其他计划的用户,则需要在where语句中使用SELECT。谢谢-这在某种程度上起作用,但遇到了与下面的答案相同的问题。它将为每个成员提供一个单行项目,但不会告诉我单个行中每个成员的所有计划,即如果一个成员有7个计划,他应该返回7行a,首先运行上述查询,然后查看OtherActivePlanCount列中是否有其他计划(如果有)。您需要点击一个查询,查询出其他计划的所有记录。如下所示,从plans sub中选择所需的所有列,其中sub.userID=?子计划1和子计划状态=1?=具有其他一些活动计划的用户id。
SELECT u.userID,
   u.Name,
   p.Id AS Plan1ActiveId,
   (SELECT COUNT(*) FROM plans sub where sub.userID = u.userID and sub.plan <> 1 and sub.status = 1) AS OtherActivePlanCount
FROM users u JOIN plans p ON (u.userID = p.userID) 
where p.plan = 1 AND p.status = 1;