【发布时间】:2017-10-26 01:58:21
【问题描述】:
我有 5 个表我想一起 LEFT JOIN。表格是: 访客、报价、合同 1、合同 2 和合同 3。
查询:
SELECT
count(DISTINCT visitors.ID) as visitors,
sum(
CASE
WHEN offers.ACTIVE = 1 THEN 1
ELSE 0
END) as offers,
count(contracts1.ID) as contracts1, sum(contracts1.PRICE) as sum_contracts1,
count(contracts2.ID) contracts2,
sum(
CASE
WHEN contracts2.PAYMENT = 'YEARLY' THEN contracts2.PRICE
WHEN contracts2.PAYMENT = 'TWICE' THEN contracts2.PRICE*2
ELSE contracts2.PRICE*4
END) as sum_contracts2,
count(contracts3.ID) as contracts3, sum(contracts3.PRICE) as sum_contracts3
FROM visitors
LEFT JOIN offersON offers.VISITOR_ID = visitors.ID AND (offers.IP > 100 OR offers.IP < 0)
LEFT JOIN contracts1 ON
(offers.ID = contracts1.ID_OFFER)
LEFT JOIN contracts2 ON
(offers.ID = contracts2.ID_OFFER)
LEFT JOIN contracts3 ON
(offers.ID = contracts3.ID_OFFER)
WHERE visitors.TIME >= '2017-01-01 00:00:00' AND visitors.TIME <= '2017-05-25 23:59:59'
这里的问题是,contracts1、contracts2 和contracts3 没有共同的列来连接在一起。因此,我得到了所有这些组合的所有组合,而不是contracts1 的 20 行、contracts2 的 30 行和contracts3 的 50 行。因为他们是根据访客和提供表格加入的。查询末尾的简单 GROUP BY 通常可以解决问题,但是如果我在 END 中对这些表之一(或所有表)使用 GROUP BY,它将创建 MULTIPLE ROWS 而不是我想要的 1。而且它还会删除我按 ID 计算访问者并按 ID 提供的部分的所有其他结果......我可以在 SELECT 的 count() 部分使用 DISTINCT,但不能使用 sum() 因为合同的 PRICE即使 ID 不同,也可能相同(例如,您知道 2 块巧克力是 2 行,ID 不同,但价格相同,每块 10 美元)。
所以我的问题是:
有没有什么方法可以只对具有 DISTINCT ID 的合同 1、合同 2 和合同 3 的价格进行求和,但可以避免重复项相加?是否可以不创建 VIEW?
我还在 LEFT JOIN 中尝试了 GROUP BY,但是当我将所有 3 个合同表一起 LEFT JOINED 时,即使我在最终得到重复项之前对它们进行了分组。
预期结果示例:
在我上面所说的那个时间范围内,我期望: 80 名参观者有 35 份报价和 5 份总金额为 1000 欧元的合同 1、12 份总金额为 686 欧元的合同 2 和 3 份总金额为 12 欧元的合同 3。它是 ONE ROW,有 8 列数据。
我得到的不是预期的结果: 80 位访客,35 份报价,180 份合同1(金额也很差),180 份合同2(金额也很差),180 份合同3(金额也很差)。
【问题讨论】:
-
乍一看似乎是一个规范化问题。如果您可以在任何地方一对一地加入它们,则无法获得所需的结果。或者,如果有这种可能性,请在子查询中使用它并加入。
-
是的,数据库是一团糟。我想创建一个选择而不是许多,以使其更快。此外,这个 ONE 选择应该只给我 6 列数据和 1 行。在这种情况下,您能否使用一个示例来说明您所说的 JOINING 子查询?我还将添加一些我想要实现的预期结果的示例(到我的问题中)。
-
首先用最少的连接得到正确的总和(SUM.. FROM x JOIN y)。使用上面的查询将它加入到主查询中。据我所知,问题是您从所有联接中获得总和。
-
这会不会适得其反?如果我必须加入 5 个表中的 3 个表 3 次才能再次将它们连接在一起?就像我想我知道你的意思,但是 VIEW 选项不是比你所说的子查询更好吗?
-
什么是 1:many 或 many:many 关系?例如,每个优惠是否有很多访客(many:1)?或相反亦然?另外,请提供
SHOW CREATE TABLE
标签: mysql join group-by sum distinct