2017-07-18 86 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