繁体   English   中英

MySQL在1个表中选择不同的记录,并根据另一个表中的值对每个组进行计数

[英]MySQL select Distinct records in 1 table and count each group based on values in another table

表格1:

| user           | bid |
---------------------------
|    may    |      0.06      |
|    dee    |      0.05      |
|    jay    |      0.04      |
|    mac    |      0.03      |
|    dee    |      0.02      |
|    mac    |      0.01      |

表2:

| user          | ratio|
---------------------------
|    dee    |      .25      |
|    jay    |      .45      |
|    mac    |      .85      |
|    fil    |      .75      |
|    may    |      .95      |

我想根据表2中的分配比率来计算表1中有多少个不同的用户落入特定范围(0-.99)。

输出:

| Ratio_Group     | Count|
---------------------------
|    0.00-0.25 |      1     |
|    0.25-0.50 |      1     |
|    0.50-0.75 |      0     |
|    0.75-0.99 |      2     |

每个比率分组中是否存在1个查询,我可以根据表2中的分组将不同的用户归入表1中? 我使用的是IF和COUNT语句的组合,但是对表1中的每一行进行了评估和计数,而不仅仅是DISTINCT用户,因此得到了夸张的结果。

例如:

 COUNT((IF table1.user <0.25,1,0))
 COUNT((IF table1.user BETWEEN 0.25 AND 0.50,1,0))
 etc...

4个查询中的每个查询都将在存储的proc中使用,因此每个比率分组我需要1个查询,因此我可以将每个组的结果分配给存储的proc中的变量。

您可以将SUMBETWEENDISTINCT结合使用

SELECT
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.00 AND 0.25) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user

SELECT
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.25 AND 0.50) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user

SELECT
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.50 AND 0.75 ) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user

SELECT
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.75 AND 0.99) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user

或者您可以将它们组合为

SELECT  '0.00 - 0.25' Ratio_Group ,
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.00 AND 0.25) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user
UNION ALL
SELECT '0.25 - 0.50' Ratio_Group ,
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.25 AND 0.50) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user
UNION ALL
SELECT '0.50 - 0.75' Ratio_Group ,
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.50 AND 0.75 ) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user
UNION ALL
SELECT '0.75 - 0.99' Ratio_Group ,
SUM(DISTINCT `table2`.`ratio` BETWEEN 0.75 AND 0.99) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) GROUP BY table1.user

编辑下面的查询将计算每个比率组的不同用户

SELECT  '0.00 - 0.25' Ratio_Group ,
COUNT(DISTINCT `table2`.`user` ) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) 
WHERE `table2`.`ratio` BETWEEN 0.00 AND 0.25

UNION ALL

SELECT '0.25 - 0.50' Ratio_Group ,
COUNT(DISTINCT `table2`.`user`) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) 
WHERE  `table2`.`ratio` BETWEEN 0.25 AND 0.50

UNION ALL

SELECT '0.50 - 0.75' Ratio_Group ,
COUNT(DISTINCT `table2`.`user` ) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) 
WHERE `table2`.`ratio` BETWEEN 0.50 AND 0.75
UNION ALL

SELECT '0.75 - 0.99' Ratio_Group ,
COUNT(DISTINCT `table2`.`user`) `count`
FROM table1 JOIN table2 ON (table1.user =table2.user) 
WHERE `table2`.`ratio` BETWEEN 0.75 AND 0.99

参见小提琴演示

如果您不介意仅抓住具有成员的组,则可以执行以下操作。 它使用内部查询来获取唯一成员及其对应比率,然后使用包含表将这些成员按比率分组为比率组。 令人高兴的是,您不必对行组进行硬编码,而这不太像SQL。 不利的一面是您看不到计数为0的“成员”行。

SELECT
    CONCAT(
        ((CEIL(ratio * 4) * 0.25 ) - 0.25),
        " - ",
        (CEIL( ratio *4 ) * 0.25)
    ) AS ratio_group,
    COUNT(user) AS user_count
FROM (
    SELECT
        t1.user,
        t2.ratio
    FROM
        `table1` t1
    INNER JOIN
        `table2` t2 ON t2.user = t1.user
    GROUP BY
        t1.user
) virtual_table
GROUP BY
    CEIL(ratio * 4)

根据您的其他注释,您可以将所有数据组合成一个字符串,并像这样分配给变量。 这真是个混蛋。 您对数据的处理方式(此时实际上是CSV字符串)由您自己决定,哈哈。

@data = 
(SELECT
    GROUP_CONCAT(combined SEPARATOR ';')
FROM (
    SELECT
        CONCAT(
            '"',
            CONCAT(
                ((CEIL(ratio * 4) * 0.25) - 0.25),
                " - ",
                (CEIL( ratio *4 ) * 0.25)
            ),
            '",',
            COUNT( user )
        ) AS combined
    FROM (
        SELECT
            t1.user,
            t2.ratio
        FROM 
            `table1` t1
        INNER JOIN
            `table2` t2 ON t2.user = t1.user
        GROUP BY
            t1.user
    ) virtual_table
    GROUP BY
        CEIL( ratio *4 )
) virtual_table2 )

暂无
暂无

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

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