MySQL计数多个外键

MySQL计数多个外键,mysql,count,foreign-keys,Mysql,Count,Foreign Keys,因此,我有一个查询,从“sites”表中进行选择,并使用外键计算“pages”的数量 SELECT s_id, s_name, s_main_url, COUNT(p_id) AS numpages FROM sites INNER JOIN pages ON sites.s_id = pages.site_id GROUP BY pages.site_id ORDER BY s_id ASC 我想添加另一个外键来计数,可能不止一个,所以我尝试了下面的方法 SELECT s_id, s_nam

因此,我有一个查询,从“sites”表中进行选择,并使用外键计算“pages”的数量

SELECT s_id, s_name, s_main_url, COUNT(p_id) AS numpages
FROM sites
INNER JOIN pages ON sites.s_id = pages.site_id
GROUP BY pages.site_id
ORDER BY s_id ASC
我想添加另一个外键来计数,可能不止一个,所以我尝试了下面的方法

SELECT s_id, s_name, s_main_url, COUNT(p_id) AS numpages, COUNT(l_id) AS numlinks
FROM sites
INNER JOIN pages ON sites.s_id = pages.site_id
INNER JOIN links ON sites.s_id = links.site_id
GROUP BY pages.site_id, links.site_id
ORDER BY s_id ASC
numpages和numlinks的计数是相同的,它们似乎将所有表的结果相乘,并给出了一些不正确的巨大数字


任何想法?

你应该考虑使用子选择而不是加入和GROUPBY。

SELECT s_id, s_name, s_main_url, numpages, numlinks
FROM sites, 
(SELECT COUNT(p_id) as numpages FROM pages WHERE pages.site_id = sites.s_id) as cnt_pages,
(SELECT COUNT(l_id) as numlink FROM links WHERE links.site_id = sites.s_id) as cnt_links
ORDER BY s_id ASC

您应该考虑使用子选择而不是联接和GROUPBY。

SELECT s_id, s_name, s_main_url, numpages, numlinks
FROM sites, 
(SELECT COUNT(p_id) as numpages FROM pages WHERE pages.site_id = sites.s_id) as cnt_pages,
(SELECT COUNT(l_id) as numlink FROM links WHERE links.site_id = sites.s_id) as cnt_links
ORDER BY s_id ASC

得到相同错误:外部查询表的未知列在内部查询中,并以不同方式解决:

SELECT s_id, s_name, s_main_url, numpages, numlinks,
(SELECT COUNT(p_id) FROM pages WHERE pages.site_id = sites.s_id) as cnt_pages,
(SELECT COUNT(l_id) FROM links WHERE links.site_id = sites.s_id) as cnt_links
FROM sites, 
ORDER BY s_id ASC

它可能有点慢,但可以工作。

得到了相同的错误:外部查询表的未知列位于内部查询中,并以不同的方式解决:

SELECT s_id, s_name, s_main_url, numpages, numlinks,
(SELECT COUNT(p_id) FROM pages WHERE pages.site_id = sites.s_id) as cnt_pages,
(SELECT COUNT(l_id) FROM links WHERE links.site_id = sites.s_id) as cnt_links
FROM sites, 
ORDER BY s_id ASC

它可能有点慢,但可以工作。

Thx的回答是:这在较大的表上不是效率较低吗?不,在内部,联接版本和子查询版本的工作方式完全相同。您可以将第一个查询重写为子查询版本,并使用EXPLAIN命令进行比较。嗨,我遇到了这个问题,因为我有同样的问题。然而,我不能得到这个答案为我工作。它一直在“where子句”中显示未知列“sites.s_id”。为了能够从子查询中引用外部查询中的表,我必须做些什么特殊的事情吗?不确定您是否曾经解决过这个问题,但我这样做是通过使子查询-从links.site_id=sites.s_id AS numlinksThx的链接中选择count*来完成的,答案是:这在较大的表上不是效率较低吗?不,在内部,联接版本和子查询版本的工作方式完全相同。您可以将第一个查询重写为子查询版本,并使用EXPLAIN命令进行比较。嗨,我遇到了这个问题,因为我有同样的问题。然而,我不能得到这个答案为我工作。它一直在“where子句”中显示未知列“sites.s_id”。为了能够从子查询中引用外部查询中的表,我必须做些什么特殊的事情吗?不确定您是否解决了这个问题,但我是通过这样做子查询的——从links.site_id=sites.s_id为numlinks的链接中选择count*from links