我的SQL计数返回了许多" 1"

时间:2014-06-10 00:37:45

标签: php mysql sql

这是我的查询

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的其余部分。这不是很好。

4 个答案:

答案 0 :(得分:3)

COUNTGROUP 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,...

    • 第一个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,这不是巧合吗?