繁体   English   中英

MySQL选择并计数具有多个相同值的行

[英]Mysql Select and count rows with multiple same values

我正在尝试创建一个查询,允许我选择如下所示的数据

id  Counter_Type Champion_Name Counter_Lane 
---|------------|------------|--------------
1  | 1          | Ahri       | 1
2  | 1          | Ahri       | 2
5  | 1          | Ahri       | 2
3  | 1          | Ahri       | 3
4  | 1          | Ahri       | 2
6  | 1          | Teemo      | 1
7  | 1          | Warwick    | 4
8  | 1          | Warwick    | 4

它应该对Counter_Lane进行计数,然后应为该名称显示具有最高数量的Counter_Type,如下所示,它应如何显示数据:

id  Counter_Type Champion_Name Counter_Lane 
---|------------|------------|--------------
1  | 1          | Ahri       | 2
2  | 1          | Teemo      | 1
3  | 1          | Warwick    | 4

我已经尝试了以下代码,并且距离我最近的代码已经超过3小时,所以有人可以帮忙。

SELECT 
    a.Counter_Type, Champion_For, a.Counter_Lane, a.Champion_Name, COUNT(*) as Amount, sum(vote_type = 'up') as Upvotes, sum(vote_type = 'down') as Downvotes, sum(vote_type = 'up')-sum(vote_type = 'down') as Totalvotes 
FROM Champion_Counters_Data a 
JOIN ( SELECT c.Counter_Lane, c.Champion_Name, COUNT(*) magnitude 
FROM Champion_Counters_Data c 
WHERE 
    Champion_For = "Aatrox" AND Counter_Type = 1 GROUP BY Champion_Name, Counter_Lane ORDER BY magnitude) b ON a.Champion_Name = b.Champion_Name AND b.Counter_Lane = a.Counter_Lane 
GROUP BY Champion_Name
SELECT * FROM your_table  GROUP BY MAX(Counter_Lane)

该查询基于您要从给定表中获得的输出。

请尝试以下SQL语句:

SELECT Counter_Type , Champion_Name, MAX(Counter_Lane) 'Counter_Lane'
FROM(
    SELECT Counter_Type , Champion_Name , Counter_Lane
    FROM Champion_Counters_Data 
    GROUP BY Counter_Type , Champion_Name 
    HAVING COUNT(Counter_Lane) >= 2
) tb
GROUP BY Counter_Type , Champion_Name

由于MySQL不允许Windows功能或CTE,因此您将需要许多子查询。

Rextester Demo

SELECT @rn := @rn + 1 as id,
t3.* 
from 
    (select t1.*
    FROM
      (SELECT counter_type,
              champion_name,
              counter_lane,
              count(*) AS cnt
       FROM table53
       GROUP BY champion_name,
                counter_lane
      ) t1
    INNER JOIN
      (SELECT counter_type,
              champion_name,
              max(cnt) AS mcnt
       FROM
            (SELECT counter_type,
                 champion_name,
                 counter_lane,
                 count(*) AS cnt
          FROM table53
          GROUP BY champion_name,
                   counter_lane
            ) t
       GROUP BY counter_type,
                champion_name
       ) t2 
    ON t1.counter_type=t2.counter_type
    AND t1.champion_name=t2.champion_name
    AND t1.cnt=t2.mcnt
    ) t3
,(SELECT @rn := 0) t
;

产量

+-----+--------------+---------------+--------------+-----+
|  id | counter_type | champion_name | counter_lane | cnt |
+-----+--------------+---------------+--------------+-----+
|   1 |            1 | Ahri          |            2 |   3 |
|   2 |            1 | Teemo         |            1 |   1 |
|   3 |            1 | Warwick       |            4 |   2 |
+-----+--------------+---------------+--------------+-----+

想法是第一组由champion_namecounter_lane并获得count 因此,对于Ahri您将获得3 cnt 现在,使用另一个子查询来获取相应的counter_lane ,对于Ahri它将为2 最后,使用序列号来产生id作为123

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM