【问题标题】:Get the list of data from one table, and some count of records from another, is it possible to do in one query?从一个表中获取数据列表,从另一个表中获取一些记录数,是否可以在一个查询中完成?
【发布时间】:2010-09-25 11:27:57
【问题描述】:

我有两张桌子 - countriestours

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

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


我需要从表countries 中获取idname 的完整列表,并按它们的顺序排序,以及表tours 中的记录数,其中tours.id_country = @987654336 @.idcountries.

即,我需要得到这样的列表

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

可以一次查询吗?

非常感谢

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:
    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
    

    【讨论】:

    • @Symon - 当您使用 COUNT()、SUM、MAX() 等“聚合函数”时,您需要在 COUNT 计算中指明指示中断/重置的列,因此SQL 知道计算所有 T.id 条目并根据第一个 C.id 和 C.name 显示该计数,然后将其内部计数器重置为 0 并在 C.id/C.name 更改时重新开始计数。 GROUP BY 子句用于标识它需要停止计算一个国家的一组记录、保留该结果、重置计数器并开始计算下一个国家的下一组记录的更改点
    • 非常感谢您的详细解释。这比许多教程中的要好得多:) 但是为什么需要按两个列对它们进行分组呢?也可以与一个一起使用。
    • @Symon - MySQL 的最新版本似乎足够聪明,可以识别 C.id 和 C.name 来自国家表中的 sae 记录,因此在 GROUP BY 中列出两者并不重要,但早期版本的 MySQL 和其他数据库不一定那么聪明,或者那么宽容......所以在 GROUP BY 中引用所有非聚合列是一个好习惯......那样,它不会突然如果您决定使用 Oracle 或 Postgres 作为数据库,或者将其托管在运行早期版本 MySQL 的服务器上,则中断查询
    【解决方案2】:
    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
    

    【讨论】:

    • GROUP BY 需要列出两个非聚合列,否则你会打败我
    • 我不知道 GROUP BY,很高兴知道!只使用 mysql (接受它),我不得不知道其他数据库不会接受它。谢谢!
    【解决方案3】:

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

    SELECT id, name, COUNT(id_country) FROM countries LEFT JOIN tours on tours.id_country = countries.id order by countries.id;

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 2017-01-14
      • 2010-12-31
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多