我无法弄清楚为什么这不起作用。基本上,我正在运行子查询来计算p.songid WHERE trackDeleted=0
的所有行。当我执行它时,子查询工作正常,但是当我实现时,我得到“子查询返回超过1行”。
SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty,
(SELECT COUNT(p.songid)
FROM songs s
LEFT JOIN users u
ON u.id = s.userid
LEFT JOIN posttracks p
ON s.songid = p.songid
WHERE p.trackDeleted=0
GROUP BY s.timeSubmitted ASC
LIMIT 25)
AS trackCount
FROM songs s
LEFT JOIN users u
ON u.id = s.userid
LEFT JOIN posttracks p
ON s.songid = p.songid
WHERE paid=1 AND s.timeSubmitted >= ( CURDATE() - INTERVAL 60 DAY )
GROUP BY s.timeSubmitted ASC
LIMIT 25
答案 0 :(得分:2)
显然,子查询不能返回多行,因为这没有意义。您只希望返回一个值 - COUNT(p.songid)
- 然而您是GROUP BY s.timeSubmitted,这将使其返回多行,并且多次计算p.songid
。
答案 1 :(得分:0)
这样考虑一下,SELECT语句中的子查询就像你需要返回一个值一样,因为它只会像你选择列表中的另一列一样。由于你有一个LIMIT 25
,你显然希望返回多个值,这对于这种用法来说是不正确的。
答案 2 :(得分:0)
好的,你的查询很乱。不仅子查询被破坏了,而且我很确定GROUP BY s.timeSubmitted ASC
没有做你认为它做的事情。 (你的意思是ORDER BY
吗?)如果你用文字解释你想要完成什么,这可能会有所帮助。
无论如何,我会猜测一下这个可能是你想要的:
SELECT
u.username, u.id, u.score, s.genre, s.songid, s.songTitle,
s.timeSubmitted, s.userid, s.insWanted, s.bounty,
COUNT(p.songid) AS trackCount
FROM songs s
LEFT JOIN users u ON u.id = s.userid
LEFT JOIN posttracks p ON p.songid = s.songid AND p.trackDeleted = 0
WHERE paid = 1 AND s.timeSubmitted >= ( CURDATE() - INTERVAL 60 DAY )
GROUP BY s.songid
ORDER BY s.timeSubmitted ASC
LIMIT 25
编辑:修正了COUNT()
,以便在没有匹配的曲目时正确返回0.