Mysql 无法使左右联合工作。(尝试模拟外部联接) 在这篇文章的底部,你可以找到一个关于我想做什么的简化查询

Mysql 无法使左右联合工作。(尝试模拟外部联接) 在这篇文章的底部,你可以找到一个关于我想做什么的简化查询,mysql,trac,Mysql,Trac,我试图创建一个查询,显示我们的TRAC系统中所有用户的生产力。我需要知道他们每周输入的所有注释,每个票证的唯一性,接触票证的数量,关闭票证的数量,以及修订的数量。下一步,我还要添加这些修订中的文件数量,检查节点。 我创建了一个查询,只要这个人在那一周内至少碰了一张票,它几乎可以根据我的需要工作。我知道,我有一些用户在提交修订时没有引用错误的票证,但我也需要捕获它们,我尝试添加正确的联接和一个联合来模拟MySQL不支持的外部联接,但我没有遇到以下错误: 1064-您的SQL语法有错误;查看与MyS

我试图创建一个查询,显示我们的TRAC系统中所有用户的生产力。我需要知道他们每周输入的所有注释,每个票证的唯一性,接触票证的数量,关闭票证的数量,以及修订的数量。下一步,我还要添加这些修订中的文件数量,检查节点。 我创建了一个查询,只要这个人在那一周内至少碰了一张票,它几乎可以根据我的需要工作。我知道,我有一些用户在提交修订时没有引用错误的票证,但我也需要捕获它们,我尝试添加正确的联接和一个联合来模拟MySQL不支持的外部联接,但我没有遇到以下错误:

1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第65行中使用的“t LEFT JOIN SELECT CONCAT”附近的正确语法

如果我把工会的两个部分中的一个注释掉,它就会起作用

我已经尝试给这些表赋予不同的别名

SELECT
   t.`author` __group__,
   t.`month-week`,
   t.changes,
   t.tickets,
   t.closed,
   r.`revisions`
FROM
(
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
   ) `t`
   LEFT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
   ) `r` ON `t`.`month-week` = `r`.`month-week` AND `t`.`author` = `r`.`author`
)
UNION
(
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
   ) `t`
   LEFT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
   ) `r` ON `t`.`month-week` = `r`.`month-week` AND `t`.`author` = `r`.`author`
)

WHERE r.revisions > 0 OR t.closed > 0
ORDER BY
   t.`author`,
   t.`month-week`
MySQL服务器/客户端版本:5.0.33

-

希望能有帮助

多亏了pst的帮助,我忘了在UNION中的表周围添加SELECT*FROM

下面是一个工作查询,适用于希望使用TRAC跟踪用户生产力的任何人


答案就在问题本身,但这里是为了防止其他人需要它:

SELECT
   `author` __group__,
   `month-week`,
   changes,
   tickets,
   closed,
   `revisions`
FROM
(
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   LEFT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
UNION
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   RIGHT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
) mtb
WHERE revisions > 0 OR closed > 0
ORDER BY
   `author`,
   `month-week`

如果我从查询中删除任何内容,它就会工作。这就是我在这里发帖的原因。我找不到导致问题的部分。查询是一个长查询,但不是一个复杂的查询。如果你使用TRAC系统,你会明白,在我看来,这篇文章很容易被贴上TRAC。。加入应该更有成效。这里连接在select之外,t也在select…dang之外。。我看到了。。。非常感谢。pst我怎样才能关闭它并给你信用?
SELECT
   `author` __group__,
   `month-week`,
   changes,
   tickets,
   closed,
   `revisions`
FROM
(
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   LEFT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
UNION
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   RIGHT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
) mtb
WHERE revisions > 0 OR closed > 0
ORDER BY
   `author`,
   `month-week`
SELECT
   `author` __group__,
   `month-week`,
   changes,
   tickets,
   closed,
   `revisions`
FROM
(
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   LEFT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time` > UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
UNION
(
   SELECT
      t.`author`,
      t.`month-week`,
      t.changes,
      t.tickets,
      t.closed,
      r.`revisions`
   FROM
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(tc.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(tc.`time`/1000000))
         ) `month-week`,
         COUNT(IF(tc.`field` = "comment",tc.ticket,NULL)) `changes`,
         COUNT(DISTINCT tc.`ticket`) `tickets`,
         COUNT(DISTINCT IF(tc.`field` = "status" AND tc.`newvalue` = "closed",tc.`ticket`,NULL)) `closed`,
         tc.`author`
      FROM `ticket_change` tc
      WHERE
         tc.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         tc.`author`,
         YEARWEEK(FROM_UNIXTIME(tc.`time`/1000000))
      ORDER BY NULL
   ) `t`
   RIGHT JOIN
   (
      SELECT
         CONCAT(
            MONTH(FROM_UNIXTIME(r.`time`/1000000)),
            '-',
            WEEK(FROM_UNIXTIME(r.`time`/1000000))
         ) `month-week`,
         COUNT(DISTINCT r.`rev`) `revisions`,
         r.`author`
      FROM `revision` r
      WHERE
         r.`time`> UNIX_TIMESTAMP(NOW()-INTERVAL 2 MONTH)*1000000
      GROUP BY
         r.`author`,
         YEARWEEK(FROM_UNIXTIME(r.`time`/1000000))
      ORDER BY NULL
   ) `r` ON t.`month-week` = r.`month-week` AND t.`author` = r.`author`
) 
) mtb
WHERE revisions > 0 OR closed > 0
ORDER BY
   `author`,
   `month-week`