簡體   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