MySQL子查询返回超过1行

时间:2011-10-07 21:09:11

标签: mysql

我无法弄清楚为什么这不起作用。基本上,我正在运行子查询来计算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

3 个答案:

答案 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.

相关问题