MySQL Count Distinct value 多列同一行

MySQL Count Distinct value multiple column same row

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

+------+----------+---------+----------+---------+
| 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,但没有任何运气,感谢您的帮助。

您的 table 需要标准化。现有的 table 结构使得查询 table.

变得困难且效率低下

话虽如此,您可以使用如下查询来获取 City 具有 3 个或更多相同动物的代码:

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

编辑: 要获得 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

您可以使用反透视技巧(使用交叉连接)来反透视 table,然后像这样进行聚合:

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;

请注意,此查询仅读取 table 一次。

此外,最好修复您的设计,即将每只动物放在不同的行中。