2017-07-18 36 views
0

选择,我有以下MySQL表:从两个MySQL表

tbl_pet_owners:

+----+--------+----------+--------+--------------+ 
| 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_types:

+----------+-------------+ 
| 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' 

但我发现了错误:“字段列表”

+3

到目前为止您尝试了哪些查询? – jackarms

+1

你几乎在那里..你需要加入这两个表,使用宠物字段作为加入条件。请对Join类型及其工作方式进行一些研究。此外,这看起来像家庭作业可疑,如果它是请编辑你的问题,并添加这一点的细节。我们都在这里提供帮助,但真的不想为你做最初的工作。 – apesa

+0

'SELECT n.name,p.pet,p.type FROM tbl_pet_owners n OUTER JOIN tbl_pet_types p ON n.pet = p.pet'这是为了让你开始,现在你必须弄清楚如何获得不同的宠物值从这个 –

回答

1

一般有两种方法:

  1. 加入的表,然后莫名其妙地聚集他们以这样的方式从第一获得不同的宠物第二个表格和类型列表。
  2. 从第一个表中获取不同的宠物,从第二个表中获取类型列表,然后加入。

我发现第二种方法好得多,因为你只加入你想加入的东西(不同的宠物与类型列表)。查询是:

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; 

的加入先蒙混过关,通过查询看起来更加简单和作品,以及:

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),这工作得很好。但是,还有其他一些情况,当您需要从两个表中加入聚合,并且此方法失败(典型情况下:乘以计数)。所以在加入之前进行汇总是一个很好的习惯。

1

我”未知列“结果”已经没有一个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小提琴把这个一起

http://sqlfiddle.com/#!9/e902e/1/0

+0

该命令返回:使用条目设置的结果集:jane |猫|哺乳动物,由于简有两只猫,我想从结果中省略猫的第二个实例。 – Brinley

+0

@Brinley:那么你有什么想法如何解决这个问题? –

+0

处理它。将在一分钟后发布我的答案。 – Brinley