Mysql 如何列出表中的所有行并从与每行相关的多个表中计数?

Mysql 如何列出表中的所有行并从与每行相关的多个表中计数?,mysql,Mysql,我制作了一个问答网站,一个问题可以有标签,用户可以订阅他们想要的标签。所以,我创建了标签页,列出所有标签,统计所有问题和订阅这些标签的用户。我发现了类似的问题,但对我来说更复杂。 下面的代码是我正在尝试的SQL,对于查询时间来说似乎非常慢。我希望下面的SQL是通过使用JOIN/LEFT-JOIN/RIGHT-JOIN来编写的,我认为它会更快。但我不知道 SQL select tag.*, (select count(*) from taggedquestion where taggedq

我制作了一个问答网站,一个问题可以有标签,用户可以订阅他们想要的标签。所以,我创建了标签页,列出所有标签,统计所有问题和订阅这些标签的用户。我发现了类似的问题,但对我来说更复杂。
下面的代码是我正在尝试的SQL,对于查询时间来说似乎非常慢。我希望下面的SQL是通过使用
JOIN/LEFT-JOIN/RIGHT-JOIN来编写的,我认为它会更快。但我不知道

SQL

select tag.*,
    (select count(*) from taggedquestion where taggedquestion.tagid = tag.id) questionCount, 
    (select count(*) from tagsubscription where tagsubscription.tagid = tag.id) userCount 
from tag order by tag.id asc
标签页

 Tag name             question count         user count
----------------------------------------------------------------
 computer               12                      5
 science                10                      3
 travel                 6                       2
 programing             18                      3
 ...                    ...                     ...
 ...                    ...                     ...
这是您的查询:

select tag.*,
       (select count(*) from taggedquestion where taggedquestion.tagid = tag.id and ids = '0'
       ) as questionCount, 
       (select count(*) from tagsubscription where tagsubscription.tagid = tag.id and ids = '0'
       ) as userCount 
from tag
order by tag.id asc;
这是一个合理的质疑。可能您需要的性能是以下索引(如果您还没有):


您可能已经有了最后一个,因为
id
可能是
标记
表上的主键。

在第二次发布的查询中,您缺少
选择
,因此获得了发布的错误。您的第二个查询应该如下所示

SELECT tag.*, 
( SELECT COUNT(*) FROM taggedquestion
 LEFT JOIN tag ON tag.id = taggedquestion.tagid 
 and taggedquestion.ids = '0') AS postCount, 
(SELECT COUNT(*) FROM tagsubscription
 LEFT JOIN tag ON tag.id = tagsubscription.tagid 
 and tagsubscription.ids = '0') AS userCount 
 FROM tag
像这样尝试,然后使用
SUM
CASE
条件。因为您没有显示表结构或示例数据;无法确定,但您可能希望通过
标记dquestion.ids
进行分组

SELECT tag.*, 
( SELECT SUM(CASE WHEN taggedquestion.ids = '0' THEN 1 ELSE 0 END) 
 FROM taggedquestion
 INNER JOIN tag 
 ON tag.id = taggedquestion.tagid 
 GROUP BY taggedquestion.ids) AS postCount, 
(SELECT SUM(CASE WHEN tagsubscription.ids = '0' THEN 1 ELSE 0 END) 
 FROM tagsubscription
 INNER JOIN tag 
 ON tag.id = tagsubscription.tagid 
 GROUP BY tagsubscription.ids) AS userCount 
 FROM tag

是的,但它给出了一个错误的结果,它似乎忽略了条件。我得到了
postCount
=标记问题中的总行数
taggedquestion
userCount
=标记订阅中的总行数
tagsubscription
所有标记表行都不起作用,请再次查看我编辑的问题。我只想将我的查询转换为使用一些
JOIN
。谢谢。尝试编辑的查询,同时考虑提供表结构和示例数据(或SQL小提琴)以获得进一步的帮助。@ USER 3695637,如果有帮助的话,考虑接受答案。
SELECT tag.*, 
( SELECT SUM(CASE WHEN taggedquestion.ids = '0' THEN 1 ELSE 0 END) 
 FROM taggedquestion
 INNER JOIN tag 
 ON tag.id = taggedquestion.tagid 
 GROUP BY taggedquestion.ids) AS postCount, 
(SELECT SUM(CASE WHEN tagsubscription.ids = '0' THEN 1 ELSE 0 END) 
 FROM tagsubscription
 INNER JOIN tag 
 ON tag.id = tagsubscription.tagid 
 GROUP BY tagsubscription.ids) AS userCount 
 FROM tag