【问题标题】:Mysql count only higest values per rowMysql 只计算每行的最高值
【发布时间】:2021-10-03 14:15:57
【问题描述】:

我无法解决这个问题

我有 2 张桌子,我想计算每个国家/地区所有用户的最高版本

例子:

John 来自美国,他有版本 1、2、3、4、5 和 6

Bob 来自法国,他有版本 1,2 和 3

玛丽也是法国人,她有版本 1,2 和 3

我想只计算其中 anny 的最新版本

因为:

John 拥有更高的版本 6,他不会被计入低于 6 的版本

Bob 有更高的版本 3,他不会被计入低于 3 的版本

Mary 的版本高于 3,她不会被计入低于 3 的版本

所以最终结果将是底部的 Desired 结果集

Table1

ID | USER  |  COUNTRY
---- ----- ----------
1  |  John |  USA
2  |  Bob  |  FRANCE
3  |  Mary |  FRANCE

Table2

ID |  USER  | VERSION
---- ------- ---------
1  |  John  |  1
2  |  Bob   |  1 
3  |  John  |  2 
4  |  Mary  |  1 
5  |  Mary  |  2 
6  |  John  |  3 
7  |  John  |  4 
8  |  Bob   |  2 
9  |  John  |  5 
10 |  Bob   |  3 
11 |  Mary  |  3 
12 |  John  |  6
Desired result set: 

Country | V1| V2 | V3 | V4 | V5 | V6 
-------- ---- --- ---- ---- ---- ----
USA     | 0 | 0  | 0  |  0 | 0  |  1 
FRANCE  | 0 | 0  | 2  |  0 | 0  |  0 

我做了一些尝试,没有运气

SELECT`Table1`.`Country` AS `C`,
    count(max( `Table2`.`Version` )) AS `V`
FROM
    ( `Table1` JOIN `Table2` ON ( ( `Table1`.`USER` = `Table2`.`USER` ) ) ) 
GROUP BY
    `Table1`.`COUNTRY`



OR SOMETHING LIKE THIS


SELECT
    `Table1`.`COUNTRY` AS `COUNTRY`,
    count(
    DISTINCT
    IF
        (
            (
                NOT (
                    `Table2`.`VERSION` IN (
                    SELECT
                        `Table2`.`VERSION` 
                    FROM
                        ( `Table1` JOIN `Table2` ON ( ( `Table1`.`USER` = `Table2`.`USER` ) ) ) 
                    WHERE
                        ( `Table2`.`VERSION` < 2 ) 
                    ) 
                ) 
            ),
            `Table2`.`ID`,
        NULL 
        ) 
    ) AS `V2`
FROM
    ( `Table1` JOIN `Table2` ON ( ( `Table1.`USER` = `Table2`.`USER` ) ) ) 
GROUP BY
    `Table1`.`COUNTRY`

请帮帮我,谢谢

【问题讨论】:

  • 到目前为止,您尝试了哪些方法,在哪里卡住了?您似乎需要每个用户的最大版本,然后按国家/地区进行动态支点。这两个问题都已经在这里得到解答...
  • 您能帮我找到有关按国家/地区进行动态支点的解决方案吗?看来我迷路了……
  • stackoverflow.com/questions/12598120/… 我真的很想知道您可以搜索什么,但您找不到基于动态数据透视关键字的链接问题

标签: mysql count


【解决方案1】:

我找到了解决办法,谢谢!

SELECT a.country
     , sum(b.version=1) as V1
     , sum(b.version=2) as V2
     , sum(b.version=3) as V3
     , sum(b.version=4) as V4
     , sum(b.version=5) as V5
     , sum(b.version=6) as V6
FROM table1 a
     JOIN (
            SELECT user
                 , MAX(version) as version
            FROM table2
            GROUP BY user
          ) b USING (user)
GROUP BY country
ORDER BY country DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2012-12-20
    • 2020-05-21
    相关资源
    最近更新 更多