【问题标题】:Trying to Merging Two grouped queries into one尝试将两个分组查询合并为一个
【发布时间】:2018-02-09 21:59:58
【问题描述】:

我正在尝试获取与帐户关联的所有点击和销售的列表,两个表都以帐户 ID 作为索引。现在我有:

SELECT ACCOUNT, SUM(REVENUE) AS R, COUNT(*) AS SALES
FROM CONVERSIONS
WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT

SELECT ACCOUNT, COUNT(DISTINCT BIN_IP) AS CLICKS
FROM CLICKS
WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT

这给了我两个列表,但是我必须做大量的数组操作才能让它们唯一地排列。试图看看是否有办法加入这两个查询,但到目前为止我尝试的一切都失败了。

编辑:为了清楚起见,我尝试过的每次加入的问题是我输掉了有销售但没有点击或点击但没有销售的情况。加入他们并检查 table.ACCOUNT = table2.ACCOUNT 只有在点击和销售都存在的情况下才有效。这基本上是我正在努力解决的难题的一部分。

【问题讨论】:

  • 听起来你想要的是一个 FULL OUTER JOIN,不幸的是它在 mySql 中不存在,但可以通过两种方式进行左外连接并合并结果来模拟它。

标签: php mysql sql select join


【解决方案1】:

如果您对您的查询感到满意,您可以使用:

SELECT conv.ACCOUNT, conv.R, conv.SALES, clicks.CLICKS
FROM
(SELECT ACCOUNT, SUM(REVENUE) AS R, COUNT(*) AS SALES
 FROM CONVERSIONS
 WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT) conv
LEFT JOIN
(SELECT ACCOUNT, COUNT(DISTINCT BIN_IP) AS CLICKS
 FROM CLICKS
 WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT) clicks
ON conv.ACCOUNT = clicks.ACCOUNT
UNION
SELECT clicks2.ACCOUNT, conv2.R, conv2.SALES, clicks2.CLICKS
FROM
(SELECT ACCOUNT, COUNT(DISTINCT BIN_IP) AS CLICKS
 FROM CLICKS
 WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT) clicks2
LEFT JOIN
(SELECT ACCOUNT, SUM(REVENUE) AS R, COUNT(*) AS SALES
 FROM CONVERSIONS
 WHERE ACCOUNT = ? AND TIME BETWEEN ? AND ? GROUP BY ACCOUNT) conv2
ON clicks2.ACCOUNT = conv2.ACCOUNT

这很混乱,因为 mySQL 没有 FULL JOIN。因此,您必须使用两个左连接和 UNION。请注意,第一组连接、conv 和 clicks 将包括只有转换记录和两个表中都有记录的情况。第二组连接 conv2 和 clicks2 将返回只有点击的情况。

【讨论】:

  • 同样的问题,您会丢失有点击但没有销售或销售但没有点击的案例。
  • 天哪,我认为它做到了,非常非常感谢你我一直在努力解决这个问题,你说得对,我基本上想要 FULL JOIN,但失败得很惨在找出解决方法。
  • 为了清楚起见,看起来这实际上使我在查询上的 CPU 开销增加了一倍?如果是这种情况,如果这是重新创建 FULL JOIN 功能的最佳方式,我可能应该坚持使用数组操作。
  • 对...如果可以的话,您可以考虑先进行左连接和联合,然后一次进行所有聚合。以上只是纯粹地告诉你如何加入这两个输出
  • 不管怎样,我都非常感谢您的帮助,因为它帮助我理解了 join\merge 如何更好地协同工作。我希望有一个我不理解 mySQL 的合理解决方法。似乎只是以我需要的方式获取输出并操作数组,这将是我正在尝试做的最低开销的解决方案。
【解决方案2】:

将列点击添加到您的第一个选择可能更容易,将列 r 和销售额添加到第二个选择。(在选择中将这些设置为 0)

然后您可以将两个选择合并并按列帐户分组。您需要对 sales、clicks 和 r 列使用 sum。

在此之后,您可以将结果与帐户表进行左连接以获取所有帐户(也包括那些没有点击和销售的帐户)

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多