SQL连接计数不起作用

时间:2011-03-18 16:03:09

标签: mysql sql join subquery

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
                JOIN Posts as p 
                ON p.PostPID = f.FlagPID
    ) as PostFlags
    FROM Posts AS p
        JOIN Users AS u
        ON p.PostUID = u.UserUID
    ORDER BY PostTime DESC
    LIMIT 0, 30

我有这个查询,我不知道为什么但是这段代码似乎不起作用,它会返回查询,如果它是这样的:

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
    ) as PostFlags
    FROM Posts AS p
        JOIN Users AS u
        ON p.PostUID = u.UserUID
    ORDER BY PostTime DESC
    LIMIT 0, 30

我做错了什么?

2 个答案:

答案 0 :(得分:1)

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
                JOIN Posts as p1
                ON p1.PostPID = f.FlagPID
                where p1.PostPID = p.PostPID
    ) as PostFlags
FROM Posts AS p
    JOIN Users AS u
    ON p.PostUID = u.UserUID
ORDER BY PostTime DESC
LIMIT 0, 30

编辑:

我认为这样会更好:

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    count(f.FlagTime) as PostFlags

FROM Posts AS p
JOIN Users AS u ON p.PostUID = u.UserUID
left join Flags f on p.PostPID = f.FlagPID

group by p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep

ORDER BY PostTime DESC
LIMIT 0, 30

答案 1 :(得分:1)

如果没有示例数据,示例输出和所需输出的描述,很难确定您需要什么。

但我注意到,您的子查询(PostFlags)包含表Posts,主查询也是如此。他们甚至拥有相同的别名。


据此我推断你想得到两件事之一......

  1. 所有帖子的所有标志的数量
    这会为结果中的每条记录提供相同的值

  2. 当前帖子的所有标志的计数
    这会为结果中的每条记录提供不同的值


  3. 如果您想要版本1,我会更改子查询的别名。而不是使用“P”,而是使用“Px”或其他东西。我不认为这必然会改变任何东西,但使用与主查询相同的别名可能会使人类读者感到困惑,更别提RDBMS了。


    如果您需要版本2,则无需在子查询中包含联接。相反,你可以做以下......

    SELECT
      p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
      (
          SELECT COUNT(FlagTime)
          FROM Flags
          WHERE FlagPID = p.PostPID
      ) as PostFlags
    FROM
      Posts AS p
    JOIN
      Users AS u
        ON p.PostUID = u.UserUID
    ORDER BY
      PostTime DESC
    LIMIT 0, 30
    

    where子句现在引用主查询中的Posts表。这成为相关子查询 - 结果取决于另一个表中字段的值。


    如果这些都不是你需要的,请举例说明;
      - 示例数据
      - 示例结果
      - 预期结果
      - 描述为什么这些是预期的