2

我不太确定如何最好地表达这个问题。我不一定需要一种方法来消除包含具有空值的列的行——我只需要弄清楚如何调整我的查询,以便它只为我需要的每个用户生成单行结果......这是一些背景信息有助于澄清:

好的,所以我有 5 个表:users、local_ads(本地广告)、local_rev(本地收入报告)、nat_ads(国家广告)和 nat_rev(国家收入报告)。

每个月,用户都会提交一份国家收入报告和一份地方收入报告。当用户创建他们的月度报告时,他们将获得本地和国家报告的唯一报告 ID。report_id 和相应的 user_id 存储在各自的表中(local_rev 或 nat_rev)。

然后用户向每个报告提交广告。为当月本地报告提交的本地广告存储在 local_ads 表中,对于给定用户,他们的每个广告共享相同的 report_id。全国广告也是如此。

local_rev 和 nat_rev 表中的每个广告都有一个价格和尺寸列。

我正在尝试执行一个查询,该查询将为每个用户生成本地广告总尺寸、本地广告数量、本地广告总价、全国广告总尺寸、全国广告数量和全国广告总价 WHERE month="x"。

这是最接近我需要的查询:

SELECT u.franchise, lr.lrr_id, CountLocId, TotalPrice, nr.nrr_id, CountNatId, TotalNMoney,     
(
TotalPrice + TotalNMoney
)TotalRev
FROM users u
LEFT JOIN local_rev lr ON u.user_id = lr.user_id
LEFT JOIN (

SELECT lrr_id, COUNT( lad_id ) CountLocId, SUM( price ) TotalPrice
FROM local_ads
GROUP BY lrr_id
)la ON lr.lrr_id = la.lrr_id
LEFT JOIN nat_rev nr ON u.user_id = nr.user_id
LEFT JOIN (

SELECT nrr_id, COUNT( nad_id ) CountNatId, SUM( tmoney ) TotalNMoney
FROM nat_ads
WHERE MONTH =  'February'
GROUP BY nrr_id
)na ON nr.nrr_id = na.nrr_id
WHERE lr.month =  'February'
ORDER BY franchise
LIMIT 0 , 30

问题是它为每个用户生成一行,每个月而不是一个月。您可以在以下结果中看到这一点。在结果中,不具有 NULL 值的行是我想要的行。所以我只需要弄清楚如何消除具有 NULL 值的行。

userA   84  39  5200    158 NULL    NULL    NULL
userA   84  39  5200    53  NULL    NULL    NULL
userA   84  39  5200    182 NULL    NULL    NULL
userA   84  39  5200    81  5   5900    11100
userB   93  1   100     51  NULL    NULL    NULL
userB   93  1   100     200 NULL    NULL    NULL
userB   93  1   100     84  9   5742    5842

因此,我尝试使用我在 Stackoverflow 上找到的数十个不同示例以及其他来源。当应用于我的特定查询时,我无法工作。我花了几个小时进行随机调整,希望得到我需要的结果,但没有运气。在这里发帖绝对是我最后的手段!

抱歉,我啰嗦了这么多,我只是想确保我提供了帮助解决我的问题所需的所有信息。非常感谢你的帮助。

4

1 回答 1

0

LEFT JOIN将on更改naINNER JOIN.

于 2013-04-25T18:44:59.520 回答