2017-02-10 12 views
1

私はMySQLを使い始めていて、最近遊んでいます。私はここ数日、私がこの問題を解決するのを手助けできるかどうかを見ています。基本的に私は私が唯一のうち3タイガーMySQLの個々の値複数の列が同じ行

+------+----------+---------+----------+---------+ 
| City | Animal1 | Animal2 | Animal3 | Animal4 | 
+------+----------+---------+----------+---------+ 
| ATL | Tiger | Tiger | Lion  | Tiger | 
+------+----------+---------+----------+---------+ 


mysql> SELECT count(DISTINCT Animal1,Animal2,Animal3,Animal4) FROM zooAnimal; 
+-------------------------------------------------+ 
| count(DISTINCT Animal1,Animal2,Animal3,Animal4) | 
+-------------------------------------------------+ 
|            5 | 
+-------------------------------------------------+ 

この場合、アトランタで..同じ動物の3以上の都市を置くロジックを見つけようとしています、次の表

+------+----------+---------+----------+---------+ 
| City | Animal1 | Animal2 | Animal3 | Animal4 | 
+------+----------+---------+----------+---------+ 
| ACY | Lion  | Giraffe | Elephant | Gorilla | 
| AMS | Elephant | Gorilla | Gorilla | Lion | 
| ATL | Tiger | Tiger | Lion  | Tiger | 
| BYU | Elephant | Tiger | Elephant | Lion | 
| QNB | Lemur | Tiger | Lemur | Gorilla | 
+------+----------+---------+----------+---------+ 

を持っています私はDISTINCTとGROUP BYで幸運なしに遊んでいます。どんな助けもありがとうございます。

+2

CITYとANIMALEという2つの列としてテーブルを保存できますか?それでは、実際に簡単になります。 – DCR

答えて

1

テーブルは正規化が必要です。既存のテーブル構造は、テーブルをクエリするのが難しく、非効率的です。

SELECT DISTINCT City 
FROM (
    SELECT City, Animal1 AS Animal 
    FROM mytable 

    UNION ALL 

    SELECT City, Animal2 AS Animal 
    FROM mytable 

    UNION ALL 

    SELECT City, Animal3 AS Animal 
    FROM mytable 

    UNION ALL 

    SELECT City, Animal4 AS Animal 
    FROM mytable 
) AS t 
GROUP BY City, Animal 
HAVING COUNT(*) >= 3 

編集:

は、あなたが同じ動物の3以上有するCityコードを取得するには、次のようなクエリを使用することができますことを言って、あなたが使用できる2 + 2一致するレコードを取得するには

SELECT City 
FROM (
    SELECT City, Animal 
    FROM (
     SELECT City, Animal1 AS Animal 
     FROM mytable 

     UNION ALL 

     SELECT City, Animal2 AS Animal 
     FROM mytable 

     UNION ALL 

     SELECT City, Animal3 AS Animal 
     FROM mytable 

     UNION ALL 

     SELECT City, Animal4 AS Animal 
     FROM mytable 
    ) AS t 
    GROUP BY City, Animal 
    HAVING COUNT(*) >= 2) AS x 
GROUP BY City 
HAVING COUNT(*) >= 2 
+0

良いアイデア - 投票アップ –

+0

パーフェクトは魅力的ですが、私はジョイントや組合などの基礎を学びます。私はちょうどMySQLを使いこなそうとしています。これは楽しいことです。正規化は次のものです。 – tom1123

+0

私は別の質問をするかもしれませんが、それぞれの動物が2つあるところをどうやって得るのですか? – tom1123

2

あなたは、テーブルをアンピボットし、その後、このように凝集ん(使用してクロス・ジョイン)のアンピボットトリックを使用することができます。このクエリは一度だけのテーブルを読み込むこと

select 
    city, 
    animal 
from (
    select 
     t.city, 
     case x.i 
      when 1 then Animal1 
      when 2 then Animal2 
      when 3 then Animal3 
      when 4 then Animal4 
     end animal 
    from your_table t 
    cross join (
     select 1 i union all 
     select 2 i union all 
     select 3 i union all 
     select 4 i 
    ) x 
) t group by city, animal 
having count(*) >= 3; 

注意。

また、デザインを修正すること、つまり各動物を別々の列に保つことも良い方法です。

+0

ありがとう、このメソッドはかなりうまくいく.. – tom1123

+2

私はそれを見るので、賢明なトリック、それで、投票! –

関連する問題