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
我做错了什么?
答案 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,我会更改子查询的别名。而不是使用“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表。这成为相关子查询 - 结果取决于另一个表中字段的值。
如果这些都不是你需要的,请举例说明;
- 示例数据
- 示例结果
- 预期结果
- 描述为什么这些是预期的