在MYSQL中,从一个表中选择具有另一个表中相应ID的记录数量

4

编辑:详细描述

详细描述:

*在table_a中有100个成员,但只有50个成员在table_b中有记录,并且只有25个成员在table_b中有approved = 1的记录,因此我需要查询返回的值是25*

大家好,这里是我正在尝试解决的查询,它将需要返回一个单一结果计数,以便我可以使用mysql_result($query, 0)访问。

SELECT COUNT(id) FROM table_a WHERE (THIS IS WHERE I AM STUCK)

我需要检查在table_a中每个id匹配的memberID在table_b中是否被批准,如果是,则计算table_b中memberID的数量。最后的结果需要是拥有table_b中条目的成员数量。

需要访问的表列的示例:

table_a
-----------------
id

table_b
------------------
id
memberID
approved

如果您需要更多细节,请告诉我。


你是想在表a中查找ID大于1的数据还是在两个表中都大于1的数据? - Jack
结果应该是a中有对应条目的行数,其中(a.id = b.memberId and b.approved = 1),这样说是否正确? - sharakan
@ukritic - 您最终的需求是返回“count(table_a.id = table_b.MemberID AND table_b.approved = 1)”值,仅在该计数为“>1”时返回吗? - dan_linder
以下是伪代码最佳方式,以表述“我需要选择COUNT(id)FROM table_a,其中table_a中的每个ID都有一个匹配到table_b中的memberID且在table_b中approved = 1的条目”。最终结果应该是一行,其中COUNT(id)=##。 - MadScientist
5个回答

3

问题已解决

必须反向思考

    SELECT COUNT( DISTINCT memberID )
    FROM table_b
    WHERE approved =1

由于我是基于 table_b 统计 memberID,所以甚至不需要查看 table_a

有时候解决方案就在你面前,非常简单。

感谢所有的帮助!希望这对未来的其他人有所帮助。


这与您的问题规范相同,只有一个微小但至关重要的细节:table_b.memberid 的任何值也出现在 table_a.id 中。如果您不告诉他们,当然没有人会知道。 - ypercubeᵀᴹ
这个查询返回了我所需要的结果。基本上,我不需要查询table_a,因为我只需要从table_b中计算DISTINCT memberID的数量。在重新思考我真正需要的信息之后,我清楚地意识到在查询中不需要table_a。 - MadScientist
是的,我的意思是正确的。同时在“DISTINCT”后面删除了不必要的括号。 - ypercubeᵀᴹ

1
我假设您想获取与 table_b 匹配且 table_b 中的值已批准的 table_a 记录数。因此,我会将这两个表连接起来。内部连接确保您只考虑在两个表中都存在的行,而 where 语句则处理已批准的要求。
select count(a.id) 
from table_a a
join table_b b
on a.id = b.memberID
where b.approved=1

这个返回了错误的数字,看起来它返回的是 table_b 中找到的所有项目的总数,而不是满足要求的 table_a 的总数。 - MadScientist
1
如果你把 COUNT(a.id) 改成 COUNT(DISTINCT a.id),我认为这样就正确了。 - ypercubeᵀᴹ

0
 SELECT b.ID, a.ID 

 FROM table_a a, table_b b 

 WHERE a.ID = b.ID AND b.ID = 1

根据 OP 的说法,他需要那些 "...在 table_b 中被批准的条目 = 1"。也就是说,b.APPROVED = 1,而你提供的是 b.ID = 1。 - sharakan
同 @sharakan 达成一致 - 测试是针对 "table_b.approved" = 1,而不是 "b.ID"。 - dan_linder

0

我在SQL方面有点生疏,但是像这样在查询中指定两个表是否可以实现这个目标:

SELECT COUNT(DISTINCT table_a.id) 
  FROM table_a, table_b 
  WHERE table_a.id = table_b.MemberID 
    AND table_b.approved = 1;

我相信这符合您的选择标准。


这将返回与上面相同的数字,看起来是table_b记录的总数,而不是符合条件的table_a记录的计数。 - MadScientist

0
SELECT COUNT(*) AS cnt
FROM table_a AS a
WHERE EXISTS
      ( SELECT *
        FROM table_b AS b
        WHERE b.memberID = a.id
          AND b.approved = 1
      )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接