过滤 6 个表 Left join mysql Select(哪里?)

filter a 6 tables Left join mysql Select (where?)

我有这 6 个不同的 tables,除了 tables 中一个名为 Player(或 Name)的字符串字段外,没有共同的 ID,这是我的共同标识符。

我的第一个 table 有完整的 table 和名称 (players_list),我开始级联左连接以获得最终的 table 聚合我的客户数据每个table(存款等)

这里是 select

SELECT
    t1.Account,
    t2.OK,
    t5.Deposits,
    t4.GGR,
    t4.GGR - t3.Bonus AS NGR,
    t3.Bonus,
    t6.withdrawal
FROM
    (
        SELECT
            `players_list`.`Account`
        FROM
            `players_list`
    ) t1
LEFT JOIN (
    SELECT
        online_players. NAME,
        'Online' AS OK
    FROM
        online_players
) t2 ON t1.Account = t2. NAME
LEFT JOIN (
    SELECT
        Player,
        Agent,
        sum(financial_view.Amount) AS Bonus
    FROM
        financial_view
    WHEREMethod LIKE '%BONUS%'
    GROUP BY
        Player
) AS t3 ON t1.Account = t3.Player
LEFT JOIN (
    SELECT
        Player,
        sum(result_account_short_date.Win) AS GGR
    FROM
        `result_account_short_date`
    WHERE
        datediff(
            Date_,
            DATE_FORMAT(
                (Now() - INTERVAL 8 HOUR),
                '%Y-%m-%d'
            )
        ) >= 0
    GROUP BY
        Player
) t4 ON t1.Account = t4.Player
LEFT JOIN (
    SELECT
        Player,
        sum(`financial_view`.`Amount`) AS Deposits
    FROM
        financial_view
    WHERE
        (
            Method NOT LIKE '%BONUS%'
            AND Type = 'Deposit'
        )

    GROUP BY
        Player
) t5 ON t1.Account = t5.Player
LEFT JOIN (
    SELECT
        Player,
        sum(financial_view.Amount) AS withdrawal
    FROM
        financial_view

    GROUP BY
        Player
) t6 ON t1.Account = t6.Player
ORDER BY
    t5.Deposits,
    t4.GGR DESC

下面的结果很好。不过,我想过滤掉至少一列没有 NULL 的玩家。 在我下面的例子中,Players : an、EST 和 munaaq 应该被过滤掉。 我怎样才能做到这一点? 谢谢

    +-----------------+--------+----------+------+------+-------+------------+
    | Account         | OK     | Deposits | GGR  | NGR  | Bonus | withdrawal |
    +-----------------+--------+----------+------+------+-------+------------+
    | Djsta           | NULL   | NULL     | 200  | NULL | NULL  | NULL       |
    | an              | NULL   | NULL     | NULL | NULL | NULL  | NULL       |
    | Ay              | Online | 25       | NULL | NULL | NULL  | NULL       |
    | moa             | NULL   | 55       | NULL | NULL | NULL  | NULL       |
    | Dhaq            | NULL   | NULL     | NULL | NULL | 50    | NULL       |
    | mohmoh          | NULL   | NULL     | 188  | NULL | NULL  | 199        |
    | EST             | NULL   | NULL     | NULL | NULL | NULL  | NULL       |
    | munaaq          | NULL   | NULL     | NULL | NULL | NULL  | NULL       |

您可以添加以下 WHERE 子句:

WHERE COALESCE(t2.OK, 
               t5.Deposits,
               t4.GGR,
               t3.Bonus,
               t6.withdrawal) IS NOT NULL

COALESCE:

Returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

您需要添加一个包含所有列的 WHERE 子句,并确保其中至少有一个是非空值。为此,您可以使用 COALESCE:

SELECT
    t1.Account,
    t2.OK,
    t5.Deposits,
    t4.GGR,
    t4.GGR - t3.Bonus AS NGR,
    t3.Bonus,
    t6.withdrawal
FROM
    (
    ... -- your code here
    )
WHERE 
    COALESCE(t2.OK,t5.Deposits,t4.GGR,t3.Bonus,t6.Withdrawal) IS NOT NULL
ORDER BY
    t5.Deposits,
    t4.GGR DESC

NGR 在空检查中不需要,因为它是由两个已经被检查的列的值计算的。

Account 列在您要加入的第一个 table 中提供,因此也不需要检查其内容。

注意:如果您知道某些列比其他列更有可能不为空,请将它们放在前面。这将加快条件检查的执行。 COALESCE 在找到第一个非空值时停止检查后续列。