gpt4 book ai didi

mysql - LEFT JOIN 仅在右表为空时返回左表的第一行

转载 作者:行者123 更新时间:2023-11-29 06:07:41 26 4
gpt4 key购买 nike

我有两个具有以下结构的表。

CREATE TABLE `countries` (
`id` BIGINT UNSIGNED AUTO_INCREMENT,
`title` VARCHAR (128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;

CREATE TABLE `cities` (
`id` BIGINT UNSIGNED AUTO_INCREMENT,
`country_id` BIGINT UNSIGNED NOT NULL,
`title` VARCHAR (128) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON DELETE CASCADE
) ENGINE = InnoDB;

然后我将 3 行添加到 countries 表:

INSERT INTO `countries` VALUES
(DEFAULT, 'India'),
(DEFAULT, 'Pakistan'),
(DEFAULT, 'Afghanistan');

现在,当我运行以下查询时:

SELECT c.title, COUNT(c2.id) AS cities
FROM countries AS c
LEFT JOIN cities AS c2
ON c2.country_id = c.id
GROUP BY c2.country_id;

我得到:

++++++++++++++++++++++++
| title | cities |
++++++++++++++++++++++++
| India | 0 |
++++++++++++++++++++++++

我期望的是:

++++++++++++++++++++++++
| title | cities |
++++++++++++++++++++++++
| India | 0 |
| Pakistan | 0 |
| Afghanistan | 0 |
++++++++++++++++++++++++

我不知道为什么查询只从左表返回 1 行。有人可以帮忙吗?

最佳答案

由于您需要 countries 的所有条目的结果表不管是否对应记录cities那么表是否存在 LEFT JOIN是正确的选择。

对于某些国家/地区,相应条目在 cities 中表可能不存在。在这种情况下,您将获得 NULL对于那些。

因为 cities 中不存在条目表你会得到NULL对于 c2.country_id对于 countries 的所有行表。

在这里NULL代表您的团队。

如果除 null 之外还有其他任何内容,那么您将获得多于 1 行。但在您的情况下,您是按 NULL 分组的.

看,c.id在这些情况下不为空,如果您按 c.id 分组那么您的示例输入中将有三个不同的 ID。因此,您会在结果集中获得三行。

SELECT c.title, COUNT(c2.id) AS cities
FROM countries AS c
LEFT JOIN cities AS c2
ON c2.country_id = c.id
GROUP BY c.id;

更多:

关于 COUNT 的一些微妙之处:

SELECT COUNT(0);   Result: 1

SELECT COUNT(-1); Result: 1

SELECT COUNT(NULL); Result: 0

SELECT COUNT(71); Result: 1

SQL FIDDLE

关于mysql - LEFT JOIN 仅在右表为空时返回左表的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40393216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com