过滤 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
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
在找到第一个非空值时停止检查后续列。
我有这 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
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
在找到第一个非空值时停止检查后续列。