Sql 计算两个表的行数

Sql 计算两个表的行数,sql,Sql,我想计算两个表的行数,我编写了以下代码: SELECT count(v.id), count(c.id) FROM votes as v, content as c WHERE v.user_id=1 AND c.created_by=1 它正确地返回一行和两列,只有这两个单元格具有完全相同的值。。。而且不应该如此您的查询正在两个表之间进行交叉联接。如果要计算行数,则需要以下内容: select 'vote' as which, count(*) from votes v where v.us

我想计算两个表的行数,我编写了以下代码:

SELECT count(v.id), count(c.id)
FROM votes as v, content as c
WHERE v.user_id=1 AND c.created_by=1

它正确地返回一行和两列,只有这两个单元格具有完全相同的值。。。而且不应该如此

您的查询正在两个表之间进行交叉联接。如果要计算行数,则需要以下内容:

select 'vote' as which, count(*)
from votes v
where v.user_id = 1
union all
select 'content' as which, count(*)
from content c
where c.created_by = 1
如果要查找一行、两列,请改用交叉联接:

select vcnt, ccnt
from (select count(*) as ccnt
      from votes v
      where v.user_id = 1
     ) v cross join
     (select count(*) as ccnt
      from content c
      where c.created_by = 1
     ) c

您需要计算不同的值,否则只需计算相应列中包含ID的行数,这些行将是所有行,除非某些ID中有空:

countDISTINCT v.id,countDISTINCT c.id


这将两个表连接在一起,但不匹配任何行。因此,对于投票中的每一行,所有内容列都将为NULL,反之亦然。COUNTColumnName不计算空值,但count*计算空值。因此,这将为您提供结果。

如果您希望数据位于同一行,则可以使用UNION ALL,然后使用CASE语句:

select max(case when col = 'voteCount' then cnt end) as voteCount,
     max(case when col = 'ContentCount' then cnt end) as ContentCount
from
(
    select count(*) cnt, 'voteCount' col
    from votes v
    where v.user_id = 1
    union all
    select count(*) cnt, 'ContentCount' col
    from content c
    where c.created_by = 1
) x

仅当所选id不为空时计数

SELECT SUM(ISNULL(v.id,0,1)), SUM(ISNULL(c.id,0,1))
FROM votes as v, content as c
WHERE v.user_id=1 AND c.created_by=1
但是,如果你需要单独计算,请遵循以下步骤

SELECT 
  (SELECT COUNT(*) FROM votes as v WHERE v.user_id=1) AS Count1,
  (SELECT COUNT(*) FROM content as c WHERE c.created_by=1) AS Count2

与v和c没有关系,因此交叉连接是不够的。您需要详细说明您的输入、预期结果和实际结果,或者具体化错误消息。这将返回1列和2行,而不是1行和2列作为操作状态。@Gordon Linoff:关于您的第一个答案,请注意UNION不保证行的顺序。第二个操作数的行可能出现在第一个操作数的行之前、之后或与第一个操作数的行混合出现。在需要特定订单的情况下,必须使用order BY。因此,我建议您附加一个描述列,如选择“VotesCount”作为Desc,count*。。。。。。否则,读取数据的客户端无法确定哪个数字代表投票计数,哪个内容计数。@petarepac。不仅你是对的,而且我在其他帖子上也发表了同样的评论。显然,我最初没有想到在一行上有两个值,所以原始代码没有回答这个问题。
SELECT 
  (SELECT COUNT(*) FROM votes as v WHERE v.user_id=1) AS Count1,
  (SELECT COUNT(*) FROM content as c WHERE c.created_by=1) AS Count2