【问题标题】:MySQL Join tables and count instancesMySQL 连接表和计数实例
【发布时间】:2011-10-20 14:42:53
【问题描述】:

假设我有以下表格:

Countries
---------------------------
| ID | Country Name       |
---------------------------
| 1  | Greece             |
| 2  | Italy              |
| 3  | Spain              |
---------------------------

Cities
---------------------------
| ID | City               |
---------------------------
| 1  | Athens             |
| 2  | Patra              |
| 3  | Rome               |
| 4  | Venice             |
---------------------------

Countries & Cities
--------------------
| ID | Cntr | City |
--------------------
| 1  |   1  |   2  |
| 2  |   1  |   1  |
| 3  |   2  |   3  |
--------------------

现在,我如何运行一个 MySQL 查询,该查询将根据“Countries & Cities”表返回国家名称和城市总数?

返回示例:

---------------------------
| Cities | Country        |
---------------------------
| 2      | Greece         |
| 1      | Italy          |
---------------------------

【问题讨论】:

  • 奇怪的设计。除非您真的需要让一个城市属于多个国家/地区,否则我认为您可以删除“Countries & Cities”表并在 Cities 表中添加一个简单的 CountryID (FK) 列。

标签: mysql sql


【解决方案1】:

试试这个:

SELECT COUNT(cs.City) as Cities, cn.name as Country
FROM countries cn 
INNER JOIN country_city cs ON cs.Cntr = cn.id 
GROUP BY cn.name

输出:

2   | Greece
1   | Italy

【讨论】:

  • 加入city表真的有必要吗?唯一的附加信息是未使用的城市名称。
  • @Flo :非常好,检查并返回相同。谢谢
【解决方案2】:

只需要一个JOIN

SELECT `c`.`name`, COUNT(`c`.id) 
FROM `countries_cities` AS `cc`
JOIN `countries` AS `c`
ON `c`.id = `cc`.country_id
GROUP BY `cc`.country_id

【讨论】:

【解决方案3】:
SELECT cn.Name, COUNT(*)
FROM CountriesAndCities cc
JOIN Countries cn ON (cn.ID = cc.Cntr)
GROUP BY cn.Name

【讨论】:

  • 这不起作用,因为 cn.Name 不包含在任何聚合函数中
  • 尝试运行它,对我来说它给了Column '@countries.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 现在编辑后它应该可以正常工作了,因为 cn.Name 在 GROUP BY 列列表中;)
【解决方案4】:

您只需在国家和城市表中对国家进行分组:

SELECT COUNT(1), c.Name 
FROM [countriesAndCities] cnc 
INNER JOIN [country] c ON cnc.cnt = c.id
GROUP BY c.Name

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多