MySQL查询计数和连接

MySQL查询计数和连接,mysql,sql,join,count,Mysql,Sql,Join,Count,我有以下疑问: SELECT shipments.file_number, file_creation_date, city_name, container_sequence FROM cities, countries, shipments LEFT OUTER JOIN container_details ON shipments.file_number = container_details.file_number WHERE destination_ocean_port = city_c

我有以下疑问:

SELECT shipments.file_number, file_creation_date, city_name, container_sequence
FROM cities, countries, shipments
LEFT OUTER JOIN container_details ON shipments.file_number = container_details.file_number
WHERE
destination_ocean_port = city_code
AND cities.country_code = countries.country_code
AND cities.country_code = 'CN'
AND file_creation_date > '2015-1-1'
AND file_creation_date < '2016-1-1' 

ORDER BY shipments.file_number;
选择装运。文件编号、文件创建日期、城市名称、集装箱顺序
来自城市、国家、货物
左外部连接装运上的容器\详细信息。文件\编号=容器\详细信息。文件\编号
哪里
目的地\海洋\港口=城市\代码
和cities.country\u代码=countries.country\u代码
和cities.country_代码='CN'
文件创建日期>'2015-1-1'
文件创建日期<'2016-1-1'
按装运订单。文件号;
它的返回方式如下:

正如您所看到的,在某些情况下,每个文件编号有多个容器序列。如何获取它,使其只返回每个文件号中的一个,同时显示每个文件号中有多少容器序列的计数

我知道这可能与连接和count()有关,但我无法理解

谢谢

您需要使用count()group by函数和group by子句来获得所需的输出。我还重写了连接以使用带有显式连接语法的内部连接

SELECT shipments.file_number, file_creation_date, city_name, count(container_sequence) as number_of_containers
FROM cities 
INNER JOIN countries ON cities.country_code = countries.country_code
INNER JOIN shipments ON shipments.destination_ocean_port = cities.city_code
LEFT OUTER JOIN container_details ON shipments.file_number = container_details.file_number
WHERE 
    cities.country_code = 'CN'
AND file_creation_date > '2015-1-1'
AND file_creation_date < '2016-1-1' 
GROUP BY shipments.file_number, file_creation_date, city_name
ORDER BY shipments.file_number;
选择shippings.file\u编号、文件创建日期、城市名称、计数(集装箱顺序)作为集装箱编号
来自城市
城市上的内部连接国家/地区。国家/地区代码=国家/地区。国家/地区代码
装运时内部加入装运。目的地\海洋\港口=城市。城市\代码
左外部连接装运上的容器\详细信息。文件\编号=容器\详细信息。文件\编号
哪里
cities.country_代码='CN'
文件创建日期>'2015-1-1'
文件创建日期<'2016-1-1'
按装运分组。文件号、文件创建日期、城市名称
按装运订单。文件号;
选择装运。文件编号、文件创建日期、城市名称、计数(集装箱顺序)作为总集装箱顺序
来自城市、国家、货物
左外部连接装运上的容器\详细信息。文件\编号=容器\详细信息。文件\编号
哪里
目的地\海洋\港口=城市\代码
和cities.country\u代码=countries.country\u代码
和cities.country_代码='CN'
文件创建日期>'2015-1-1'
文件创建日期<'2016-1-1'
按装运分组。文件号
按装运订单。文件号;

尝试使用distinct(Shippings.file_number),不确定这是否是您想要的。简单规则:在
FROM
子句中切勿使用逗号。始终使用显式的
JOIN
语法。那么这有什么帮助呢?根据mysql配置,这将起作用或不起作用。但是,在选择列表中包含不在group by列表中、也不聚合的字段肯定不是一个好的做法。此外,您仍然在为联接使用逗号语法,这可能会产生意外的副作用。
SELECT shipments.file_number, file_creation_date, city_name, count(container_sequence) as total_container_sequence
FROM cities, countries, shipments
LEFT OUTER JOIN container_details ON shipments.file_number = container_details.file_number
WHERE
destination_ocean_port = city_code
AND cities.country_code = countries.country_code
AND cities.country_code = 'CN'
AND file_creation_date > '2015-1-1'
AND file_creation_date < '2016-1-1' 
GROUP BY shipments.file_number
ORDER BY shipments.file_number;