2011-10-07 220 views
2

我不明白为什么这不起作用。基本上,我正在运行一个子查询来计算p.songid WHERE trackDeleted=0的所有行。当我自己执行它时,子查询工作正常,但是当我实现时,我得到“子查询返回多于一行”。MySQL子查询返回多于一行

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 

回答

2

显然,子查询不能返回多于一行,因为这没有意义。您只希望返回一个值 - COUNT(p.songid) - 但您GROUP BY s.timeSubmitted,这将使其返回多行,并且多个计数p.songid

+0

我基本上试图创建一个新的列与轨道数所有轨道WHERE deletedTrack = 0。我还会怎么做呢? – user978905

+0

只需从子查询中删除GROUP BY和LIMIT子句 –

+0

如果我这样做,它会为每一行返回相同的值。我需要它能够返回每个songid的tracksDeleted = 0的行数。 – user978905

0

想想这样,SELECT语句中的子查询就像你有需要返回一个值,因为它将像你选择列表中的另一列那样行事。由于你的身上有一个LIMIT 25,你显然希望有一个以上的价值回来,这对这种用法是正确的。

+0

我本质上是试图创建一个新的列与轨道数所有轨道WHERE deletedTrack = 0。我还会怎么做呢? – user978905

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,如果没有匹配轨道。