2011-10-07 12 views
2

これはなぜ動作しないのか分かりません。基本的には、p.songid WHERE trackDeleted=0のすべての行をカウントするためにサブクエリを実行しています。私はそれを単独で実行するとき、サブクエリはうまく動作しますが、実装すると、 "サブクエリは1行以上返されます"。MySQLサブクエリが2つ以上の行を返しました

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

明らかに、サブクエリは複数の行を返すことはできません。これは意味をなさないためです。 1つの値、つまりCOUNT(p.songid)が返されますが、GROUP BY s.timeSubmittedによって複数の行が返され、複数のカウントがp.songidになることだけが期待されます。

+0

私は本質的に、削除トラック= 0のすべてのトラックのトラック数で新しい列を作成しようとしています。私はこれについて他にどのように行くだろうか? – user978905

+0

サブクエリー –

+0

からGROUP BY句とLIMIT句を削除すると、各行に同じ値が返されます。私は、各songidのtracksDeleted = 0の行数を返すことができるようにする必要があります。 – user978905

0

このように考えると、SELECTステートメントのサブクエリは、選択リストの別の列のように動作するため、単一の値を返す必要があります。あなたはLIMIT 25を持っているので、明らかに、複数の値が戻ってくることを期待しています。これは、この使用法では不正解です。

+0

私は本質的に、deletedTrack = 0のすべてのトラックのトラック数で新しい列を作成しようとしています。私はこれについて他にどのように行くだろうか? – user978905

0

OK、あなたのクエリは混乱です。サブクエリが壊れているだけでなく、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を返しませんように一致するトラック。