从两个MySQL表中进行选择
我有以下MySQL表: 宠物主人:从两个MySQL表中进行选择,mysql,sql,Mysql,Sql,我有以下MySQL表: 宠物主人: +----+--------+----------+--------+--------------+ | id | name | pet | city | date_adopted | +----+--------+----------+--------+--------------+ | 1 | jane | cat | Boston | 2017-07-11 | | 2 | jane | dog | B
+----+--------+----------+--------+--------------+
| id | name | pet | city | date_adopted |
+----+--------+----------+--------+--------------+
| 1 | jane | cat | Boston | 2017-07-11 |
| 2 | jane | dog | Boston | 2017-07-11 |
| 3 | jane | cat | Boston | 2017-06-11 |
| 4 | jack | cat | Boston | 2016-07-11 |
| 5 | jim | snake | Boston | 2017-07-11 |
| 6 | jim | goldfish | Boston | 2017-07-11 |
| 7 | joseph | cat | NYC | 2016-07-11 |
| 8 | sam | cat | NYC | 2017-07-11 |
| 9 | drew | dog | NYC | 2016-07-11 |
+----+--------+----------+--------+--------------+
tbl_宠物_类型:
+----------+-------------+
| pet | type |
+----------+-------------+
| cat | mammal |
| dog | mammal |
| goldfish | fish |
| goldfish | seacreature |
| snake | reptile |
+----------+-------------+
下面是我要构造的SQL命令(英文):
选择名称、宠物和宠物类型,主人所在城市为波士顿。此外,结果集中不允许重复。结果将是:
+------+----------+-------------------+
| name | pet | type |
+======+==========+===================+
| jane | cat | mammal |
+------+----------+-------------------+
| jane | dog | mammal |
+------+----------+-------------------+
| jack | cat | mammal |
+------+----------+-------------------+
| jim | snake | reptile |
+------+----------+-------------------+
| jim | goldfish | fish, seacreature |
+------+----------+-------------------+
这就是我到目前为止所做的:
SELECT result FROM (
SELECT DISTINCT owners.name, owners.pet, owners.city,
group_concat(DISTINCT types.type separator ', ') AS type
FROM tbl_pet_owners owners
INNER JOIN tbl_pet_types types ON owners.pet = types.pet
GROUP BY owners.name, owners.pet )
as result WHERE result.city = 'Boston'
但我得到了一个错误:“字段列表”中的未知列“结果”我手头没有mysql实例,但我认为这接近您需要的:
SELECT tpo.name,
tpo.pet,
GROUP_CONCAT(DISTINCT tpt.type separator ', ') AS type
FROM tbl_pet_owners tpo
INNER JOIN tbl_pet_types tpt ON tpt.pet = tpo.pet AND tpo.city = 'Boston'
GROUP BY tpo.name,
tpo.pet;
编辑我已经在SQL Fiddle中将其组合在一起
我手头没有mysql实例,但我认为这已经接近您所需要的了:
SELECT tpo.name,
tpo.pet,
GROUP_CONCAT(DISTINCT tpt.type separator ', ') AS type
FROM tbl_pet_owners tpo
INNER JOIN tbl_pet_types tpt ON tpt.pet = tpo.pet AND tpo.city = 'Boston'
GROUP BY tpo.name,
tpo.pet;
编辑我已经在SQL Fiddle中将其组合在一起
通常有两种方法:
select
pet_owners.name,
pet_owners.pet,
pet_types.types
from
(
select distinct name, pet
from tbl_pet_owners
where city = 'Boston'
) pet_owners
join
(
select pet, group_concat(type) as types
from tbl_pet_types
group by pet
) pet_types on pet_types.pet = pet_owners.pet;
join first muddle through查询看起来简单得多,而且也可以工作:
select
po.name,
po.pet,
group_concat(distinct pt.type) as types
from tbl_pet_owners po
join tbl_pet_types pt on pt.pet = po.pet
where po.city = 'Boston'
group by po.name, po.pet;
两个表都是聚合的(一个是通过
DISTINCT
,一个是通过GROUP BY
),这一切都很好。然而,当您需要从两个表连接聚合时,这种方法失败了(典型的情况是:乘以计数)。因此,加入前聚合是一个好习惯。通常有两种方法:
select
pet_owners.name,
pet_owners.pet,
pet_types.types
from
(
select distinct name, pet
from tbl_pet_owners
where city = 'Boston'
) pet_owners
join
(
select pet, group_concat(type) as types
from tbl_pet_types
group by pet
) pet_types on pet_types.pet = pet_owners.pet;
join first muddle through查询看起来简单得多,而且也可以工作:
select
po.name,
po.pet,
group_concat(distinct pt.type) as types
from tbl_pet_owners po
join tbl_pet_types pt on pt.pet = po.pet
where po.city = 'Boston'
group by po.name, po.pet;
两个表都是聚合的(一个是通过
DISTINCT
,一个是通过GROUP BY
),这一切都很好。然而,当您需要从两个表连接聚合时,这种方法失败了(典型的情况是:乘以计数)。因此,加入前聚合是一个好习惯。到目前为止,您尝试了哪些查询?您几乎做到了。。您需要使用Pet字段作为连接条件来连接这两个表。请对连接类型及其工作方式进行一些研究。此外,这看起来像是可疑的家庭作业,如果是,请编辑你的问题并添加一些细节。我们都是来帮助你的,但真的不想为你做最初的工作。从tbl_宠物主人中选择n.name、p.pet、p.type n外部加入tbl_宠物类型p ON n.pet=p.pet
这是为了让你开始,现在你必须弄清楚如何从中获得不同的宠物值你的实际问题是什么?你试过什么问题?它有什么问题?因为这显然是一个家庭作业,我应该提到第一个表没有规范化(因为我假设所有记录中都有一个所有者在同一个城市),并且您(希望)在真正的DBMS中找不到它。我认为用它来教你是个坏主意。到目前为止你有什么疑问?你快到了。您需要使用Pet字段作为连接条件来连接这两个表。请对连接类型及其工作方式进行一些研究。此外,这看起来像是可疑的家庭作业,如果是,请编辑你的问题并添加一些细节。我们都是来帮助你的,但真的不想为你做最初的工作。从tbl_宠物主人中选择n.name、p.pet、p.type n外部加入tbl_宠物类型p ON n.pet=p.pet
这是为了让你开始,现在你必须弄清楚如何从中获得不同的宠物值你的实际问题是什么?你试过什么问题?它有什么问题?因为这显然是一个家庭作业,我应该提到第一个表没有规范化(因为我假设所有记录中都有一个所有者在同一个城市),并且您(希望)在真正的DBMS中找不到它。我认为把它用于教学是一个坏主意。这个命令返回:一个结果集的条目:珍妮猫哺乳动物,哺乳动物。由于jane有两只猫,我希望从结果中省略第二只猫的实例。正在处理它。我会在一分钟内公布我的答案。@ThorstenKettner-seeabove@Brinley我已经更新了答案,并提供了一个SQL Fiddle链接。该命令返回:一个结果集,条目为:jane | cat |哺乳动物,哺乳动物。由于jane有两只猫,我希望从结果中省略第二只猫的实例。正在处理它。我会在一分钟内公布我的答案。@ThorstenKettner-seeabove@Brinley我已经更新了答案,并提供了一个SQL FIDLE链接。