[英]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中的变量。
您可以将SUM
与BETWEEN
和DISTINCT
结合使用
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.