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