从两个MySQL表中进行选择

从两个MySQL表中进行选择,mysql,sql,Mysql,Sql,我有以下MySQL表: 宠物主人: +----+--------+----------+--------+--------------+ | id | name | pet | city | date_adopted | +----+--------+----------+--------+--------------+ | 1 | jane | cat | Boston | 2017-07-11 | | 2 | jane | dog | B

我有以下MySQL表:

宠物主人:

+----+--------+----------+--------+--------------+
| 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中将其组合在一起


通常有两种方法:

  • 连接这些表,然后以某种方式聚合它们,以便从第一个表中获得不同的pet,并键入第二个表的列表
  • 从第一个表中获取不同的宠物,从第二个表中获取类型列表,然后加入
  • 我发现第二种方法要好得多,因为你只加入你想加入的东西(带有类型列表的不同宠物)。查询是:

    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,并键入第二个表的列表
  • 从第一个表中获取不同的宠物,从第二个表中获取类型列表,然后加入
  • 我发现第二种方法要好得多,因为你只加入你想加入的东西(带有类型列表的不同宠物)。查询是:

    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链接。