Mysql在另一个查询中运行计数明显?

时间:2013-05-03 14:18:48

标签: php mysql

我有一个返回行数组的mysql查询。我需要从一列中获取不同值的计数。 我的查询是动态的,其中由php评估的多个条件改变了WHERE子句,所以我真的想在一个查询中完成所有操作,以避免重复每一个动态条件。

以下是我想要做的简单版本 -

如果这代表我的sql表的一个非常简单的版本:

Column1, Column2, Column3, Group, Active
   a   ,    b   ,    c   ,   1  ,  YES
   d   ,    e   ,    f,  ,   2  ,  YES
   g   ,    h   ,    i   ,   1  ,  YES
   j   ,    k   ,    l   ,   3  ,  NO

我想做这样的事情:

"SELECT Column1, Column2, Column3, Group,
(SELECT COUNT(DISTINCT Group) FROM 'table') AS totalGroups
 FROM 'table'
WHERE Active like 'YES';"

我希望结果能够报告:

a)查询中的总行数

mysql_num_rows($result) should equal = 3

b)不同组的总数

$phparray['totalgroups'] should equal = 2
(Right now, 'totalgroups' equals = 3)

(1)可以这样做吗?目前,'totalgroups'返回3而不是2。我可以使用与查询其余部分相同的“Where”子句吗?

在我的实际代码中,这个代码要复杂得多,当我只想要它返回2时,我的计数返回1,945。:)

(2)有更好的方法吗?

我尝试了php的array_unique()array_count_values(),但array_unique()不适用于多维数组,我无法让array_count_values()正常工作。

我查看了许多其他问题,但找不到有人问这个问题的问题。 我查看了MYSQL手册RE子查询,但没有解决是否可以共享Where子句。

如果你必须有我的实际代码才能回答这个问题(而不是上面的演示代表),请告诉我。所有php动态限定符都超过两页,所以为了清晰起见,我决定编写演示代码。

1 个答案:

答案 0 :(得分:2)

您是否正在尝试获取表格中所有记录的列表,以及每行上的活动行数和唯一活动组的计数?

如果是这样的话,那么: -

SELECT Column1, Column2, Column3, Group, ActiveDistinctGroups.ActiveCnt, ActiveGroups.ActiveCnt
FROM 'table' a
CROSS JOIN (SELECT COUNT(DISTINCT Group) AS ActiveCnt FROM 'table' WHERE Active like 'YES') AS ActiveDistinctGroups
CROSS JOIN (SELECT COUNT(Group) AS ActiveCnt FROM 'table' WHERE Active like 'YES') AS ActiveGroups
WHERE Active like 'YES'

如果你真的需要避免额外的WHERE子句: -

SELECT Column1, Column2, Column3, Group, ActiveDistinctGroups.ActiveCnt, ActiveGroups.ActiveCnt
FROM 'table' a
INNER JOIN (SELECT Active, COUNT(DISTINCT Group) AS ActiveCnt FROM 'table' GROUP BY Active) AS ActiveDistinctGroups ON a.Active = ActiveDistinctGroups.Active
INNER JOIN (SELECT ActiveCOUNT(Group) AS ActiveCnt FROM 'table' GROUP BY Active) AS ActiveGroups ON a.Active = ActiveGroups.Active
WHERE a.Active like 'YES'