-1

我有一个返回行数组的 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()and array_count_values(),但array_unique()不适用于多维数组,并且无法array_count_values()正常工作。

我查看了许多其他问题,但找不到有人在问这个特定问题的地方。我查看了 MYSQL 手动 RE 子查询,但它没有说明您是否可以共享 Where 子句。

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

4

1 回答 1

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'
于 2013-05-03T15:38:59.280 回答