[英]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.