这是我的查询
SELECT * FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
GROUP BY a.id
这会返回1,500行。
现在我正在尝试计算,所以我将顶行更改为SELECT COUNT(*) FROM a
。现在我得到1,500行数字1而不是1,500行。如何返回1,500而不是1,500 1?
查询有点难看,但我陷入了PHPActiveRecord的限制范围内。如果有人知道AR解决方案也会很好,但如果不是,我总能编写一些SQL。问题是PHP AR"计数"函数基本上是SELECT COUNT(*)
+ SQL的其余部分。这不是很好。
答案 0 :(得分:3)
当COUNT
与GROUP BY
一起使用时,它基本上意味着“根据给定的值集合对结果集进行分区,并返回每个组中的总行数”。如果您想说,找到在给定列中最常使用的值,这非常有用。同样的逻辑适用于所有聚合函数。
考虑下表:
id | val
--------
1 | foo
2 | bar
3 | baz
4 | foo
如果您使用GROUP BY id
进行查询,则会看到:
SELECT id, COUNT(*) FROM myTable GROUP BY id
1 | 1
2 | 1
3 | 1
4 | 1
如您所见,这表明每组中有一行。这表示表中没有具有相同id
值的记录。但是,如果按val
分组,您会看到不同的内容:
SELECT val, COUNT(*) FROM myTable GROUP BY val
bar | 1
baz | 1
foo | 2
这表示表格中有两条val
值为'foo'
的记录。但是,如果您完全删除GROUP BY
:
SELECT COUNT(*) FROM myTable
4
这会将整个表视为一个组,并计算该组中的行数。请注意,您可以COUNT
特定列中不同值的总数,如下所示:
SELECT COUNT(DISTINCT val) FROM myTable
3
这会将整个表视为一个组,并计算该组中的行数。
我设置了一个快速demonstration,因此您可以使用此数据集并亲自尝试。
如果您希望查询只返回表中的总行数(或表中的连接数),只需删除GROUP BY
子句即可。这将是整个结果集中的所有行:
SELECT COUNT(*) FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
要返回a.id
的不同值的总数,请使用:
SELECT COUNT(DISTINCT a.id) FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
答案 1 :(得分:1)
您想计算群组的总数时,您在计算群组中存在多少成员?
我会试试这个
SELECT COUNT(DISTINCT a.id)
FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
如果您想要所有组的所有成员的总数,那么它是
SELECT COUNT(*)
FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
从技术上讲,如果您希望从原始查询返回的'行'你可以做到
SELECT COUNT(*)
FROM (your other query) AS something
但表现不佳。只计算与您要查找的行匹配的行更容易。
通过将数据分组在一起来进行分组,然后您可以指定有关这些组的查询。在大多数SQL系统中,您只能使用有关组的聚合查询,执行SELECT *会失败,但MySQL允许它。
如果您想深入了解SQL和数据库,请阅读关系代数(它是SQL的基础)
特别针对group by子句: http://en.wikipedia.org/wiki/Relational_algebra#Aggregation
答案 2 :(得分:0)
直接的解决方案是使用子查询,即嵌套SELECT (请参阅下面的解决方案),或使用临时表。
解决方案:
#------------
SELECT COUNT(*) FROM (
SELECT a.id, a.b_id, a.c_id
FROM `a`
INNER JOIN `b` ON ( `a`.b_id = `b`.id )
INNER JOIN `c` ON ( `a`.c_id = `c`.id )
LEFT JOIN d ON d.a_id = a.id
GROUP BY a.id
) AS t1
;
#------------
此处有一个细微差别:您应该省略不必要的列或使用别名来识别' id'列和其他具有重复名称的列,因为否则你会得到"重复的列名称' id' "错误。 因为您的查询" SELECT * FROM ..."您的列名称包含' id'名称重复:
id,b_id,c_id,id,id,a_id,...
a.id
,第二个来自b.id
,第三个来自c.id
(这里" ..."表示可能是其他一些列,此处未提及,但您也应使用别名来表示相同的名称。)如果您查询您的选择,您将收到错误,例如" ...重复列名称' id' "
为了避免它省略不必要的列或使用别名(请参阅here附近'可以使用AS alias_name ...')为select_expr提供别名。
详细的文档以及MySQL子查询here
答案 3 :(得分:-1)
如果你想知道有多少组,这应该会返回1500.但你应该多了解一下团体,并了解其他答案者所说的话。
SELECT COUNT(*) FROM (
SELECT 1 as dummy FROM `a`
INNER JOIN `b` ON(`a`.b_id = `b`.id)
INNER JOIN `c` ON(`a`.c_id = `c`.id)
LEFT JOIN d ON d.a_id=a.id
GROUP BY a.id
) as T
丹尼尔威廉姆斯已经分享了这些信息,我很抱歉一开始并没有全部阅读。我仍然怀疑你真正想做的就是:
SELECT COUNT(*) FROM `a`
根据你的解释,他们都返回数字1500,这不是巧合吗?