2015-04-29 34 views
9

我有3個mysql表(動物,類別和animal_2_category)。每個動物可以有0-n種類(例如魚,寵物,昆蟲,食肉動物,「可以飛」等)。Mysql排序的彙編值

表 「動物」(ID,姓名)

1, dog 
2, cat 
3, bee 
... 

表 「類別」(ID,姓名)

1, pet 
2, insect 
3, mammal 
4, fish 
5, can fly 
... 

表 「animal_2_category」(animal_id,CATEGORY_ID)

1, 1 
1, 3 
2, 1 
2, 3 
3, 2 
3, 5 
... 

我現在需要的是所有類別組合的列表。 下面的查詢工作:

SELECT CONCAT_WS("-", x.name, c.name) 
FROM animal_2_category a2c1 
    JOIN animal_2_category a2c2 ON a2c1.animal_id = a2c2.animal_id 
    JOIN category c ON c.id = a2c2.category_id´ 
    JOIN categories x 
GROUP BY a2c2.category_id 

該查詢西港島線返回如下:

  • 寵物哺乳動物
  • 哺乳類寵物
  • 昆蟲能飛

問題這是,我得到dublicate條目「寵物哺乳動物」和「哺乳動物寵物」。 我怎樣才能修改查詢,僅得到其中之一,例如:

  • 寵物哺乳動物
  • 昆蟲能飛,以避免重複對
+0

非常好的問題 –

+0

沒有必要來連接這些數據。事實上,粗略地說,在CONCAT或GROUP_CONCAT需要作爲答案的一部分的SQL中沒有問題。 – Strawberry

+0

只需添加一個要求,即一個結果的ID必須低於另一個結果的ID。 – Strawberry

回答

2

您也可以重寫查詢爲

SELECT DISTINCT GREATEST(CONCAT_WS("-", x.name, c.name),CONCAT_WS("-", c.name, x.name)) col 
FROM animal_2_category a2c1 
    JOIN animal_2_category a2c2 ON a2c1.animal_id = a2c2.animal_id 
    JOIN categories c ON c.id = a2c2.`category_id` 
    JOIN categories `x` ON a2c1.category_id = x.id 
    WHERE x.name <> c.name 

DEMO

1

的一種方法是,以確保您對總是以相同的順序創建。我們可以通過在if語句中組合你的對來做到這一點,這有效地爲我們分類了這兩個值。然後我們抓住不同的行。

select distinct if(c1.name > c2.name, concat_ws('-', c1.name, c2.name), concat_ws('-', c2.name, c1.name)) pairing 
    from animal_2_category a1 
    inner join animal_2_category a2 
     on a1.animal_id = a2.animal_id 
     and a1.category_id <> a2.category_id 
    inner join categories c1 
     on a1.category_id = c1.id 
    inner join categories c2 
     on a2.category_id = c2.id; 

或者,只是在連接標準中更具選擇性,所以它們只能按特定順序連接。這避免瞭如果,但我們仍然需要抓住不同的值。

select distinct concat_ws('-', c1.name, c2.name) pairing 
    from animal_2_category a1 
    inner join animal_2_category a2 
     on a1.animal_id = a2.animal_id 
     and a1.category_id < a2.category_id 
    inner join categories c1 
     on a1.category_id = c1.id 
    inner join categories c2 
     on a2.category_id = c2.id; 

demo here

無論哪種方式,結果都是一樣的。

1
SELECT DISTINCT combos 
FROM (
    SELECT animal_id 
    , GROUP_CONCAT(c.name ORDER BY c.name SERPERATOR '-') AS combos 
    FROM animal_2_category a2c 
    JOIN category c ON c.id = a2c.category_id 
    GROUP BY animal_id 
) AS ilv 
+0

如果他希望單個類別出現以及類別配對,那麼這很好,否則它需要一些「擁有」愛。 –