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@SamiSalamiCodeCount
只是count列的别名,您可以随意调用它。X
是子查询的别名,每个子查询都需要一个别名,您也可以重命名它。这是以列格式获取所有值,然后将它们旋转到一行。我尝试了第二种方法,因为我喜欢使用适当的方法,因为我不理解它们,不幸的是我不是这样。它可能不起作用,因为上面你称它为“codecount”,下面是“codecount”,我也不知道“x”到底是什么意思,它的命名是否像AS x
?我相信你的答案也是正确的,只是不能为我证明这一点,但它肯定会对其他用户有所帮助,因此+1@SamiSalamiCodeCount
只是count列的别名,您可以随意调用它。X
是子查询的别名,每个子查询都需要一个别名,您也可以重命名它。这是获取列格式中的所有值,然后将它们旋转到一行。就我所了解的DISTINCT
而言,这不是我要寻找的,因为我的条件不是选择单个列,而是选择某些行,就我所读到的DISTINCT
而言,这不是我想要的,因为我的条件不是选择一列,而是选择某行,在该列中有某个值。