Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-使用多个表和每个表的条件选择计数_Mysql_Count - Fatal编程技术网

MySQL-使用多个表和每个表的条件选择计数

MySQL-使用多个表和每个表的条件选择计数,mysql,count,Mysql,Count,我有一个非常简单的问题: 我有三个表,我想返回每个表使用的行数(有外键) 这是我第一次尝试: SELECT COUNT(at.code) AS atcount, COUNT(de.code) AS decount, COUNT(ch.code) AS chcount FROM table_at at, table_ch ch, table_de de WHERE

我有一个非常简单的问题:

我有三个表,我想返回每个表使用的行数(有外键)

这是我第一次尝试:

    SELECT 
        COUNT(at.code) AS atcount, 
        COUNT(de.code) AS decount, 
        COUNT(ch.code) AS chcount 
    FROM 
        table_at at, 
        table_ch ch, 
        table_de de 
    WHERE 
        at.teilnehmerid != 0
    AND
        de.teilnehmerid != 0
    AND
        ch.teilnehmerid != 0
但这不起作用,不会产生任何错误,只是没有考虑条件。我还考虑了子查询,例如:

    SELECT 
        (SELECT COUNT(code) FROM table_at at WHERE at.teilnehmerid != 0), 
        (SELECT COUNT(code) FROM table_de de WHERE de.teilnehmerid != 0), 
        (SELECT COUNT(code) FROM table_ch ch WHERE ch.teilnehmerid != 0)
但我对这次尝试的愚蠢之处感到困惑。。。来自的
呢?
当然,我得到了一个错误:
操作数应该包含1列。
-但我只需要计数

我还阅读了有关联接的内容,但不明白如何通过主
SELECT
语句中的
JOIN
获取
COUNT

是的,我在这里读到了一些其他问题,但没有看到适用于这两个问题的答案:

  • 选择多个表

  • 对多个表执行
    计数

如果我错了,只是没有得到正确的答案,也许一个更好的解释会有所帮助。

COUNT(x)
COUNT(DISTINCT x)
非常不同。前者对所有值进行多重计数,后者只对不同的值进行计数。也许后者是您想要使用的。

COUNT(x)
COUNT(DISTINCT x)
非常不同。前者对所有值进行多重计数,后者只对不同的值进行计数。也许后一种方法就是您想要使用的方法。

您可能能够连接表以获得结果,但是如果不查看表结构以及它们之间的关系,这是很困难的

您可以使用
UNION ALL
,通过以下方式获得结果:

select count(code) CodeCount, 'atcount' col
from table_at
where teilnehmerid != 0
union all
select count(code) CodeCount, 'chcount' col
from table_ch
where teilnehmerid != 0
union all
select count(code) CodeCount, 'decount' col
from table_de
where teilnehmerid != 0
这将在单个列中为您提供值,如果您希望将它们列在一行中,则可以使用以下选项:

select 
    max(case when x.col = 'atcount' then x.codecount else 0 end) atcount,
    max(case when x.col = 'chcount' then x.codecount else 0 end) chcount,
    max(case when x.col = 'decount' then x.codecount else 0 end) decount
from 
(
    select count(code) CodeCount, 'atcount' col
    from table_at
    where teilnehmerid != 0
    union all
    select count(code) CodeCount, 'chcount' col
    from table_ch
    where teilnehmerid != 0
    union all
    select count(code) CodeCount, 'decount' col
    from table_de
    where teilnehmerid != 0
) x

您可能能够联接表以获得结果,但如果不查看表结构以及它们之间的关系,则很难实现

您可以使用
UNION ALL
,通过以下方式获得结果:

select count(code) CodeCount, 'atcount' col
from table_at
where teilnehmerid != 0
union all
select count(code) CodeCount, 'chcount' col
from table_ch
where teilnehmerid != 0
union all
select count(code) CodeCount, 'decount' col
from table_de
where teilnehmerid != 0
这将在单个列中为您提供值,如果您希望将它们列在一行中,则可以使用以下选项:

select 
    max(case when x.col = 'atcount' then x.codecount else 0 end) atcount,
    max(case when x.col = 'chcount' then x.codecount else 0 end) chcount,
    max(case when x.col = 'decount' then x.codecount else 0 end) decount
from 
(
    select count(code) CodeCount, 'atcount' col
    from table_at
    where teilnehmerid != 0
    union all
    select count(code) CodeCount, 'chcount' col
    from table_ch
    where teilnehmerid != 0
    union all
    select count(code) CodeCount, 'decount' col
    from table_de
    where teilnehmerid != 0
) x
因为
COUNT();那么

SELECT * 
FROM
(SELECT COUNT(code) FROM table_at at WHERE teilnehmerid != 0) as T1, 
(SELECT COUNT(code) FROM table_de de WHERE teilnehmerid != 0) as T2, 
(SELECT COUNT(code) FROM table_ch ch WHERE teilnehmerid != 0) as T3
连接将返回一行。

因为
COUNT()
返回一行、一列;那么

SELECT * 
FROM
(SELECT COUNT(code) FROM table_at at WHERE teilnehmerid != 0) as T1, 
(SELECT COUNT(code) FROM table_de de WHERE teilnehmerid != 0) as T2, 
(SELECT COUNT(code) FROM table_ch ch WHERE teilnehmerid != 0) as T3

连接将返回一行。

看起来很有希望,但不起作用,我在php中以数组的形式获取结果,
$row['T1']
为空,以及T2和T3,我可以保证有多行满足条件。啊,对不起,我的错误,T1没有引用返回的值:-)
$row[0]
-
$row[2]
返回被锁定的值,但不起作用,我在php中以数组的形式获取结果,
$row['T1']
为空,以及T2和T3,我可以保证有多行满足条件。啊,对不起,我的错误,T1没有引用返回的值:-)
$row[0]
-
$row[2]
返回值我尝试了第二种方法,因为我喜欢使用适当的方法,因为我不理解它们,不幸的是我不是这样。它可能不起作用,因为上面你称它为“codecount”,下面是“codecount”,我也不知道“x”到底是什么意思,它的命名是否像
AS x
?我相信你的答案也是正确的,只是不能为我证明这一点,但它肯定会对其他用户有所帮助,因此+1@SamiSalami
CodeCount
只是count列的别名,您可以随意调用它。
X
是子查询的别名,每个子查询都需要一个别名,您也可以重命名它。这是以列格式获取所有值,然后将它们旋转到一行。我尝试了第二种方法,因为我喜欢使用适当的方法,因为我不理解它们,不幸的是我不是这样。它可能不起作用,因为上面你称它为“codecount”,下面是“codecount”,我也不知道“x”到底是什么意思,它的命名是否像
AS x
?我相信你的答案也是正确的,只是不能为我证明这一点,但它肯定会对其他用户有所帮助,因此+1@SamiSalami
CodeCount
只是count列的别名,您可以随意调用它。
X
是子查询的别名,每个子查询都需要一个别名,您也可以重命名它。这是获取列格式中的所有值,然后将它们旋转到一行。就我所了解的
DISTINCT
而言,这不是我要寻找的,因为我的条件不是选择单个列,而是选择某些行,就我所读到的
DISTINCT
而言,这不是我想要的,因为我的条件不是选择一列,而是选择某行,在该列中有某个值。