开发者

MySQL Subquery returned more than 1 row

I cannot figure out why this is not working. Basically, I am running a subquery to count all rows of p.songid WHERE trackDeleted=0. The subquery works fine when I execute it by itself, but when I implement I get "subquery returned more than 1 row".

SELECT u.username, u.id, u.score,开发者_如何学JAVA 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


Obviously, a sub-query can't return more than one row, as this makes no sense. You only expect one value to be returned - COUNT(p.songid) - yet you GROUP BY s.timeSubmitted, which will make it return multiple rows, and multiple counts of p.songid.


Think about it this way, a subquery in the SELECT statement like you have needs to return a single value since it is going to act like just another column in your select list. Since you have a LIMIT 25 on yours, you're obviously expecting more than one value back, which is inocrrect for this usage.


OK, your query is a mess. Not only is the subquery broken, but I'm pretty sure the GROUP BY s.timeSubmitted ASC isn't doing what you think think it does. (Did you mean ORDER BY instead?) It might help if you explained in words what you're trying to accomplish.

Anyway, I'm going to take a wild guess and suggest that this might be what you want:

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

Edit: Fixed the COUNT() so that it will correctly return 0 if there are no matching tracks.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜