MYSQL查询 - 某些结果不返回

时间:2010-12-20 14:58:43

标签: mysql

我的SQL查询有问题:

SELECT table_2.id, SUM(table_2.time + table_4.time + table_6.time + table_8.time + table_10.time + table_12.time) AS total_time, SUM(table_2.connects + table_4.connects + table_6.connects + table_8.connects + table_10.connects + table_12.connects) AS total_connects FROM table_2
  INNER JOIN table_4 ON table_2.id = table_4.id
  INNER JOIN table_6 ON table_2.id = table_6.id
  INNER JOIN table_8 ON table_2.id = table_8.id
  INNER JOIN table_10 ON table_2.id = table_10.id
  INNER JOIN table_12 ON table_2.id = table_12.id
GROUP BY table_2.authid ORDER BY total_time DESC

好的,我有一个脚本可以获取用户IDS和花费的时间,然后根据他们输入的论坛将其放入mysql表中。上面的查询似乎工作正常,但仅适用于已进入所有论坛的用户,因为未在所有论坛中输入的其他用户不会返回任何结果。

ID始终相同,用户ID和连接数是用户进入特定论坛的次数。

如果您了解我的问题并了解安装请告诉我,否则我会尝试更好地解释

由于

5 个答案:

答案 0 :(得分:2)

我认为这样做的好方法可能是:

SELECT id, SUM(time), SUM(connects) 
FROM (
    SELECT id, time, connects FROM table_2
UNION ALL
    SELECT id, time, connects FROM table_4
UNION ALL
    SELECT id, time, connects FROM table_6
UNION ALL
    SELECT id, time, connects FROM table_8
UNION ALL
    SELECT id, time, connects FROM table_10
UNION ALL
    SELECT id, time, connects FROM table_12
) uniontable
GROUP BY id

因为它们都有相同的字段。

编辑:听起来将它们合并到一个表中可能并不是一个奇怪的想法,特别是如果你想像这样计算总时间;)

编辑2:对不起,这根本就不是有效的SQL。这应该会更好。

答案 1 :(得分:0)

通过LEFT OUTER JOIN替换INNER JOIN,这将获得所有表格的结果。你可能需要重新定义SUM,可能你会在没有访问过所有论坛的用户上获得NULL ...

答案 2 :(得分:0)

您将需要使用外部联接,您将需要使用IFNULL或类似的东西来将“用户不在论坛中”空白映射为零。

SELECT t2.id,
       SUM(IFNULL(t2.time,      0) + IFNULL(t4.time,      0) +
           IFNULL(t6.time,      0) + IFNULL(t8.time,      0) +
           IFNULL(t10.time,     0) + IFNULL(t12.time,     0)) AS total_time,
       SUM(IFNULL(t2.connects,  0) + IFNULL(t4.connects,  0) +
           IFNULL(t6.connects,  0) + IFNULL(t8.connects,  0) +
           IFNULL(t10.connects, 0) + IFNULL(t12.connects, 0)) AS total_connects
  FROM table_2 AS t2
  LEFT JOIN table_4  AS t4  ON t2.id = t4.id
  LEFT JOIN table_6  AS 76  ON t2.id = t6.id
  LEFT JOIN table_8  AS t8  ON t2.id = t8.id
  LEFT JOIN table_10 AS t10 ON t2.id = t10.id
  LEFT JOIN table_12 AS t12 ON t2.id = t12.id
GROUP BY t2.id ORDER BY total_time DESC

这几乎有效;它适用于访问table_2中存储信息的论坛的所有用户。为了使其适用于不访问“table_2论坛”的人,查询需要使用定义用户的表并对该表执行外连接:

SELECT u.id,
       SUM(IFNULL(t2.time,      0) + IFNULL(t4.time,      0) +
           IFNULL(t6.time,      0) + IFNULL(t8.time,      0) +
           IFNULL(t10.time,     0) + IFNULL(t12.time,     0)) AS total_time,
       SUM(IFNULL(t2.connects,  0) + IFNULL(t4.connects,  0) +
           IFNULL(t6.connects,  0) + IFNULL(t8.connects,  0) +
           IFNULL(t10.connects, 0) + IFNULL(t12.connects, 0)) AS total_connects
  FROM Users         AS u
  LEFT JOIN table_2  AS t2  ON u.id = t2.id
  LEFT JOIN table_4  AS t4  ON u.id = t4.id
  LEFT JOIN table_6  AS 76  ON u.id = t6.id
  LEFT JOIN table_8  AS t8  ON u.id = t8.id
  LEFT JOIN table_10 AS t10 ON u.id = t10.id
  LEFT JOIN table_12 AS t12 ON u.id = t12.id
GROUP BY u.id ORDER BY total_time DESC

但是,考虑到table_N表的对称性,我认为你应该做Spiny Norman 建议并重新设计您的模式,以便有一个表存储时间和连接值:

CREATE TABLE ForumUsage
(
    ForumID    INTEGER NOT NULL REFERENCES Forums,
    UserID     INTEGER NOT NULL REFERENCES Users,
    Time       INTEGER NOT NULL,
    Connects   INTEGER NOT NULL
);

然后你总结该表中的条目。

答案 3 :(得分:0)

JOIN替换为LEFT JOIN

SELECT  people.id, SUM(COALESCE(table_2.time, 0) + COALESCE(table_4.time, 0) + table_6.time, 0) + COALESCE(table_8.time, 0) + COALESCE(table_10.time, 0) + COALESCE(table_12.time, 0)) AS total_time,
        SUM(COALESCE(table_2.connects, 0) + COALESCE(table_4.connects, 0) + COALESCE(table_6.connects, 0) + COALESCE(table_8.connects, 0) + COALESCE(table_10.connects, 0) + COALESCE(table_12.connects, 0)) AS total_connects
FROM    people p
LEFT JOIN
        table_2
ON      table_2.id = people.id
LEFT JOIN
        table_4
ON      people.id = table_4.id
LEFT JOIN
        table_6
ON      people.id = table_6.id
LEFT JOIN
        table_8
ON      people.id = table_8.id
LEFT JOIN
        table_10
ON      people.id = table_10.id
LEFT JOIN
        table_12
ON      people.id = table_12.id
GROUP BY
        people.authid
ORDER BY
        total_time DESC

答案 4 :(得分:0)

@afonso:我认为你应该在创建新用户时填充所有时间表,方法是插入时间为0的用户(只是为了让他们在表中)。对于您的应用程序来说,这只是一个可接受的折衷方案,只是让这些用户在表中,以便您的初始查询能够正常工作吗?

相关问题