【问题标题】:Joining two select queries on a results field在结果字段上加入两个选择查询
【发布时间】:2012-06-13 11:11:12
【问题描述】:

我正在尝试在“分钟”字段上加入查询结果 - 这是事件的小时:分钟。我有两个不同的选择查询,我正在尝试 UNION(这可能不对,只是尝试不同的东西,我发现 MySQL 文档很难阅读)。

所以我想要

H:M 然后是 addCount 和 projectsNum 的结果 - 所以对于每个小时/分钟我都有统计数据。

我哪里错了?

(
SELECT
    DATE_FORMAT(`when`, '%H:%i') as `min`,
    COUNT(`ipAddress`) AS `addCount`
FROM `metric` m 
WHERE `when` BETWEEN DATE_SUB(NOW(), INTERVAL 3 HOUR) AND NOW()
GROUP BY DAY(`when`), HOUR(`when`), MINUTE(`when`)
)
UNION
(
SELECT
    DATE_FORMAT(v.`created`, '%H:%i') as `min`,
    COUNT(v.`projID`) as `projectsNum`
FROM `projects` v
WHERE v.`created` BETWEEN DATE_SUB(NOW(), INTERVAL 3 HOUR) AND NOW()
GROUP BY DAY(v.`created`), HOUR(v.`created`), MINUTE(v.`created`)
) 

【问题讨论】:

  • 请识别您的代码并使其易于阅读;)

标签: php mysql select join union


【解决方案1】:

UNION 只是将一组结果附加到另一组结果。

您需要将第二个查询用作子查询:

SELECT
    DATE_FORMAT(`when`, '%H:%i') as `min`,
    COUNT(`ipAddress`) AS `addCount`,
    projects_subquery.`projectsNum`
FROM `metric` m
JOIN (

    SELECT
        DATE_FORMAT(v.`created`, '%H:%i') as `min`,
        COUNT(v.`projID`) as `projectsNum`
    FROM `projects` v
    WHERE v.`created` BETWEEN DATE_SUB(NOW(), INTERVAL 3 HOUR) AND NOW()
    GROUP BY DAY(v.`created`), HOUR(v.`created`), MINUTE(v.`created`)

) AS projects_subquery ON projects_subquery.`min` = m.`min`
WHERE `when` BETWEEN DATE_SUB(NOW(), INTERVAL 3 HOUR) AND NOW()
GROUP BY DAY(`when`), HOUR(`when`), MINUTE(`when`)

这个查询可能执行得很糟糕。我只是从您的原始查询中强力复制粘贴以使其在语法上正确,但必须有一种方法来优化它。

【讨论】:

  • 谢谢您 - 但似乎与数据不符。每分钟都有相同的项目数。此外,m.min 必须只有我 min 才能工作。
  • "每一分钟都有相同的 projectsNum" :这是正常检查内部查询的 GROUP BY 子句(以前是您的“第二”查询“)。这只返回一个结果(因此,只有一个projectsNum 对应一个给定的min)。仅检查此查询的结果。我不确定您对m.min 的意思,请您改写一下吗?还请提供(手工制作的)样本您的预期结果,因为我对此也有点困惑。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 2016-11-07
  • 2016-09-22
  • 1970-01-01
  • 2021-11-12
  • 2017-04-30
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多