从一个表中获取数据列表,并从另一个表中获取一些记录数,是否可以在一个查询中执行?

问题描述:

我有两个表 - countries,tours从一个表中获取数据列表,并从另一个表中获取一些记录数,是否可以在一个查询中执行?

countries具有字段(id),(name),(order

tours具有字段(id),(id_country)...


我需要得到整个列表idname从表countries按照它们的顺序排列,并且记录的计数在表tours中,其中toursid_country = countriesidcountries

也就是说,我需要得到这样的名单

id name  count_of_tours 
1 France 15 
2 England 22 
............................. 

是否有可能在一个查询呢?

感谢很多

SELECT C.id, 
     C.name, 
     COUNT(T.id) as count_of_tours 
    FROM countries C 
    LEFT JOIN tours T 
     ON T.id_country = C.id 
GROUP BY C.id, 
      C.name 
ORDER BY C.order 
+2

@Symon - 当你使用诸如COUNT(),SUM,MAX()等等“集合函数”时,你需要在COUNT计算中指明表示中断/重置的列,所以SQL知道计算所有T. id条目并显示相对于第一个C.id和C.name的计数,然后将其内部计数器重置为0,并在C.id/C.name更改时重新开始计数。 GROUP BY子句用于识别需要停止计算一个国家/地区的一组记录的变更点,保留该结果,重置计数器并开始计算下一个国家的下一组记录 – 2010-09-25 11:54:05

+0

非常感谢您的详细解释。这比许多教程要好得多:)但是为什么需要用两个colomns对它们进行分组?与一个合作。 – Simon 2010-09-25 12:00:29

+0

@Symon - 最新的MySQL版本似乎足够聪明地认识到,C.id和C.name来自于国家表中的记录SAE,所以它不是关键在GROUP BY同时列出,但较早版本的MySQL和其他数据库并不一定是聪明,或宽容......所以这是一个很好的习惯引用在GROUP所有的非聚集列BY ......这样一来,如果你决定它不会突然中断查询使用Oracle或Postgres作为数据库,或者将其托管在运行早期版本MySQL的服务器上 – 2010-09-25 12:04:33

SELECT countries.id, countries.name, COUNT(id_country) AS Count 
FROM countries 
LEFT JOIN tours 
on tours.id_country = countries.id 
GROUP BY id_country 
ORDER BY countries.order 
+0

GROUP BY需要列出两个非聚合列,但除此之外,你打我吧 – 2010-09-25 11:38:39

+0

我不知道有关GROUP BY,很高兴知道!只使用mysql(接受它),我不得不知道其他数据库不会接受它。谢谢 ! – 2010-09-25 12:28:01

这是真正的所有可能你需要学习的是加入的使用。当您使用连接时,您可以连接两个表的结果并将输出作为一个输出。

SELECT ID,姓名,COUNT(id_country)各国留下的countries.id JOIN上tours.id_country = countries.id为了旅游;