MySQL Count Distinct值多列同一行

时间:2017-02-10 15:53:57

标签: mysql distinct mariadb

我是MySQL新手并且最近一直在玩它...我在这里看看是否有人可以帮助我解决这个问题我过去几天一直在努力。基本上我有以下表格

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

我试图找到一个逻辑,只会将城市中的3个或更多相同的动物......在这种情况下,亚特兰大有三个虎

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

我一直在玩DISTINCT和GROUP BY而没有任何运气,任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:1)

您的桌子需要规范化。现有的表结构使查询表变得困难且低效。

话虽如此,您可以使用以下查询来获取具有3个或更多相同动物的function_that_returns_deferred().addCallback(json.dumps) 个代码:

City

编辑:要获得2 + 2个匹配的记录,您可以使用;

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

答案 1 :(得分:1)

你可以使用unpivoting技巧(使用交叉连接)来解开表格,然后像这样进行聚合:

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;

请注意,此查询只会读取一次表。

此外,修复您的设计会更好,即将每只动物分开放置。