2011-10-07 210 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,如果沒有匹配軌道。